From 407a8a47a1111a84233d96ea19acd0f9979b1675 Mon Sep 17 00:00:00 2001 From: Daijah Etienne <60789323+d-etienne@users.noreply.github.com> Date: Mon, 26 Jul 2021 19:05:51 -0400 Subject: [PATCH 1/5] Adding syslog functionality --- sonic_data_client/non_db_client.go | 31 ++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/sonic_data_client/non_db_client.go b/sonic_data_client/non_db_client.go index 12336a686..5f5047eeb 100644 --- a/sonic_data_client/non_db_client.go +++ b/sonic_data_client/non_db_client.go @@ -101,6 +101,10 @@ var ( path: []string{"OTHERS", "osversion", "build"}, getFunc: dataGetFunc(getBuildVersion), }, + { // Get device syslog + path: []string{"OTHERS", "device", "syslog"}, + getFunc: dataGetFunc(getDeviceSyslog), + }, } ) @@ -229,6 +233,33 @@ func getCpuUtil() ([]byte, error) { return b, nil } +func getDeviceSyslog() ([]byte, error) { + hostName := "localhost" + portNum := "5150" + service := hostName + ":" + portNum + bufferSize := 1024 + RemoteAddr, err := net.ResolveUDPAddr("udp4", service) + portConn, err := net.ListenUDP("udp4", RemoteAddr) + if err != nil { + log.V(2).Infof("%v", err) + return nil, err + } + defer portConn.Close() + buffer := make([]byte, bufferSize) + payloadSize, _, err := portConn.ReadFromUDP(buffer) + if err != nil { + log.V(2).Infof("%v", err) + return buffer, err + } + if bufferSize < payloadSize { + log.V(2).Infof("Payload was larger than buffer", err) + return nil, nil + } + + log.V(4).Infof("getDeviceSyslog, output %v", string(buffer[:payloadSize])) + return buffer[:payloadSize], nil +} + func getProcMeminfo() ([]byte, error) { memInfo, _ := linuxproc.ReadMemInfo("/proc/meminfo") b, err := json.Marshal(memInfo) From c44b32e31f400a08a7176d95ed052efbf0d392c6 Mon Sep 17 00:00:00 2001 From: Daijah Etienne <60789323+d-etienne@users.noreply.github.com> Date: Tue, 27 Jul 2021 11:03:44 -0400 Subject: [PATCH 2/5] importing "net" dependency --- sonic_data_client/non_db_client.go | 1 + 1 file changed, 1 insertion(+) diff --git a/sonic_data_client/non_db_client.go b/sonic_data_client/non_db_client.go index 5f5047eeb..e891cf0f7 100644 --- a/sonic_data_client/non_db_client.go +++ b/sonic_data_client/non_db_client.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "net" "sync" "time" From fde6d908c58563e6200f67a020a4c5688b2dbba0 Mon Sep 17 00:00:00 2001 From: d-etienne Date: Tue, 27 Jul 2021 18:10:20 +0000 Subject: [PATCH 3/5] Adding syslog pipeline design document --- doc/img/syslogNonDbFlowChart.PNG | Bin 0 -> 27073 bytes doc/img/syslogPipeline.PNG | Bin 0 -> 73985 bytes doc/syslogPipeline.md | 45 +++++++++++++++++++++++++++++ sonic_data_client/non_db_client.go | 34 +++++++++++++++++++++- 4 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 doc/img/syslogNonDbFlowChart.PNG create mode 100644 doc/img/syslogPipeline.PNG create mode 100644 doc/syslogPipeline.md diff --git a/doc/img/syslogNonDbFlowChart.PNG b/doc/img/syslogNonDbFlowChart.PNG new file mode 100644 index 0000000000000000000000000000000000000000..410260880f8012ceb69ffbd0ad65937afa648414 GIT binary patch literal 27073 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 WY9;da%+%eAfgE*kwXcMpzWOg#iKid{ literal 0 HcmV?d00001 diff --git a/doc/img/syslogPipeline.PNG b/doc/img/syslogPipeline.PNG new file mode 100644 index 0000000000000000000000000000000000000000..e2e28736c54a881cf6096a66866208129e94bf21 GIT binary patch literal 73985 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 literal 0 HcmV?d00001 diff --git a/doc/syslogPipeline.md b/doc/syslogPipeline.md new file mode 100644 index 000000000..94b3ac4e5 --- /dev/null +++ b/doc/syslogPipeline.md @@ -0,0 +1,45 @@ +# SONiC Telemetry Syslog Pipeline +* [Overview](#overview) + * [Purpose](#purpose) + * [Syslog Extraction Method](#syslog-extraction-method) +* [Pipeline Design](#pipeline-design) +* [Design Implementation](#design-implementation) + +# Overview +## Purpose: +To replace the original UDP Proxy syslog pipeline to allow a secure transfer of syslog information from the SONiC device using the streaming telemetry servive to the client. + + +## Syslog Extraction Method +There were two methods considered for extracting the syslogs from the device to be available to the streaming telemetry service: + +* Method 1: Reading the information directly from the log files (/var/log/syslog*) +* Method 2: Streaming the syslog updates from the device's syslog server + +Method 2 was chosen to proceed with due it ability to bypass the log rotate issue and lessened CPU time. + +# Pipeline Design + +![SONiC TELEMETRY SYSLOG PIPELINE](img/syslogPipeline.PNG) + +The syslog messages are sent to the telemetry service through a newly created syslog server port. The messages are taken to the gRPC server where it is forwarded to the collector service. + +**The gMNI server will receive the syslog information utilizing streaming mode through the OTHERS database.** + + +# Design Implementation +In order to create this new functionality, A function and data set path was added to the [non-db client](/sonic-data-client/non_db_client.go). + +This new function was created in order to retrieve and read messages from the syslog server as demonstrated through the following flowchart: + +![SYSLOG NON-DB CLIENT FUNCTION](img/syslogNonDbFlowChart.PNG) + + + + + + + + + + diff --git a/sonic_data_client/non_db_client.go b/sonic_data_client/non_db_client.go index 12336a686..3ac15f2d3 100644 --- a/sonic_data_client/non_db_client.go +++ b/sonic_data_client/non_db_client.go @@ -4,6 +4,7 @@ import ( "encoding/json" "fmt" "io/ioutil" + "net" "sync" "time" @@ -101,6 +102,10 @@ var ( path: []string{"OTHERS", "osversion", "build"}, getFunc: dataGetFunc(getBuildVersion), }, + { // Get device syslog + path: []string{"OTHERS", "device", "syslog"}, + getFunc: dataGetFunc(getDeviceSyslog), + }, } ) @@ -229,6 +234,33 @@ func getCpuUtil() ([]byte, error) { return b, nil } +func getDeviceSyslog() ([]byte, error) { + hostName := "localhost" + portNum := "5150" + service := hostName + ":" + portNum + bufferSize := 1024 + RemoteAddr, err := net.ResolveUDPAddr("udp4", service) + portConn, err := net.ListenUDP("udp4", RemoteAddr) + if err != nil { + log.V(2).Infof("%v", err) + return nil, err + } + defer portConn.Close() + buffer := make([]byte, bufferSize) + payloadSize, _, err := portConn.ReadFromUDP(buffer) + if err != nil { + log.V(2).Infof("%v", err) + return buffer, err + } + if bufferSize < payloadSize { + log.V(2).Infof("Payload was larger than buffer", err) + return nil, nil + } + + log.V(4).Infof("getDeviceSyslog, output %v", string(buffer[:payloadSize])) + return buffer[:payloadSize], nil +} + func getProcMeminfo() ([]byte, error) { memInfo, _ := linuxproc.ReadMemInfo("/proc/meminfo") b, err := json.Marshal(memInfo) @@ -581,7 +613,7 @@ func (c *NonDbClient) Close() error { return nil } -func (c *NonDbClient) Set(delete []*gnmipb.Path, replace []*gnmipb.Update, update []*gnmipb.Update) error { +func (c *NonDbClient) Set(delete []*gnmipb.Path, replace []*gnmipb.Update, update []*gnmipb.Update) error { return nil } func (c *NonDbClient) Capabilities() []gnmipb.ModelData { From 8985eb812813801a0a04e521809d922e5085e476 Mon Sep 17 00:00:00 2001 From: Daijah Etienne <60789323+d-etienne@users.noreply.github.com> Date: Thu, 12 Aug 2021 15:02:46 -0400 Subject: [PATCH 4/5] Update syslogPipeline.md --- doc/syslogPipeline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/syslogPipeline.md b/doc/syslogPipeline.md index 94b3ac4e5..1f47f875c 100644 --- a/doc/syslogPipeline.md +++ b/doc/syslogPipeline.md @@ -7,7 +7,7 @@ # Overview ## Purpose: -To replace the original UDP Proxy syslog pipeline to allow a secure transfer of syslog information from the SONiC device using the streaming telemetry servive to the client. +To replace the original syslog pipeline to allow a secure transfer of syslog information from the SONiC device using the streaming telemetry servive to the client. ## Syslog Extraction Method From 77416a63f008e06f9025e687180a2817f4a1ccde Mon Sep 17 00:00:00 2001 From: d-etienne Date: Thu, 19 Aug 2021 22:16:09 +0000 Subject: [PATCH 5/5] adding on-change functionality for the syslog data set --- sonic_data_client/non_db_client.go | 88 ++++++++++++++++++++++++++---- 1 file changed, 77 insertions(+), 11 deletions(-) diff --git a/sonic_data_client/non_db_client.go b/sonic_data_client/non_db_client.go index 3ac15f2d3..823921048 100644 --- a/sonic_data_client/non_db_client.go +++ b/sonic_data_client/non_db_client.go @@ -1,6 +1,7 @@ package client import ( + "container/list" "encoding/json" "fmt" "io/ioutil" @@ -29,6 +30,25 @@ const ( type dataGetFunc func() ([]byte, error) +// connects the port for the syslog messages +func openPort() { + hostName := "localhost" + portNum := "5150" + service := hostName + ":" + portNum + RemoteAddr, err := net.ResolveUDPAddr("udp4", service) + portConn, err := net.ListenUDP("udp4", RemoteAddr) + if err != nil { + log.V(2).Infof("%v", err) + return + } + syslogPort = portConn +} + +// closes the port for the syslog messages +func closePort() { + syslogPort.Close() +} + type path2DataFunc struct { path []string getFunc dataGetFunc @@ -62,6 +82,9 @@ var ( clientTrie *Trie statsR statsRing + // the connection port for the syslog data set + syslogPort *net.UDPConn + versionFileStash sonicVersionYmlStash // ImplIoutilReadFile points to the implementation of ioutil.ReadFile. Should be overridden by UTs only. @@ -235,19 +258,9 @@ func getCpuUtil() ([]byte, error) { } func getDeviceSyslog() ([]byte, error) { - hostName := "localhost" - portNum := "5150" - service := hostName + ":" + portNum bufferSize := 1024 - RemoteAddr, err := net.ResolveUDPAddr("udp4", service) - portConn, err := net.ListenUDP("udp4", RemoteAddr) - if err != nil { - log.V(2).Infof("%v", err) - return nil, err - } - defer portConn.Close() buffer := make([]byte, bufferSize) - payloadSize, _, err := portConn.ReadFromUDP(buffer) + payloadSize, _, err := syslogPort.ReadFromUDP(buffer) if err != nil { log.V(2).Infof("%v", err) return buffer, err @@ -460,6 +473,10 @@ func (c *NonDbClient) StreamRun(q *queue.PriorityQueue, stop chan struct{}, w *s for _, sub := range subscribe.GetSubscription() { subMode := sub.GetMode() if subMode != gnmipb.SubscriptionMode_SAMPLE { + if subMode == gnmipb.SubscriptionMode_ON_CHANGE { + streamOnChange(c, stop, sub) + return + } putFatalMsg(c.q, fmt.Sprintf("Unsupported subscription mode: %v.", subMode)) return } @@ -526,6 +543,55 @@ func streamSample(c *NonDbClient, stop chan struct{}, sub *gnmipb.Subscription, } } +func streamOnChange(c *NonDbClient, stop chan struct{}, sub *gnmipb.Subscription) { + storageBuffer := list.New() + gnmiPath := sub.GetPath() + openPort() + getter, _ := c.path2Getter[gnmiPath] + + c.q.Put(Value{ + &spb.Value{ + Timestamp: time.Now().UnixNano(), + SyncResponse: true, + }, + }) + + for { + elem, _ := getter() + // adds new elem to storage space + storageBuffer.PushBack(elem) + select { + case <-stop: + log.V(1).Infof("Stopping NonDbClient.streamOnChange routine for sub '%s'", sub) + // closes the port once the connection has been made + closePort() + return + + default: + // prints value to the gnmi client + spbv := &spb.Value{ + Prefix: c.prefix, + Path: gnmiPath, + Timestamp: time.Now().UnixNano(), + SyncResponse: false, + Val: &gnmipb.TypedValue{ + Value: &gnmipb.TypedValue_JsonIetfVal{ + JsonIetfVal: storageBuffer.Back().Value.([]byte), + }}, + } + err := c.q.Put(Value{spbv}) + if err != nil { + log.V(3).Infof("Failed to put for %v, %v", gnmiPath, err) + } else { + log.V(6).Infof("Added spbv #%v", spbv) + } + // removes the message once it has been sent to the client + storageBuffer.Remove(storageBuffer.Front()) + } + + } +} + // runGetterAndSend runs a given getter method and puts the result to client queue. func runGetterAndSend(c *NonDbClient, gnmiPath *gnmipb.Path, getter dataGetFunc) error { v, err := getter()