feat(inputs.gnmi): Support Juniper GNMI Extension Header (#13116)
This commit is contained in:
parent
f297d3e6c3
commit
a868add749
|
|
@ -70,6 +70,14 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
|
||||||
# prefix = ""
|
# prefix = ""
|
||||||
# target = ""
|
# target = ""
|
||||||
|
|
||||||
|
## Vendor specific options
|
||||||
|
## This defines what vendor specific options to load.
|
||||||
|
## * Juniper Header Extension (juniper_header): some sensors are directly managed by
|
||||||
|
## Linecard, which adds the Juniper GNMI Header Extension. Enabling this
|
||||||
|
## allows the decoding of the Extension header if present. Currently this knob
|
||||||
|
## adds component, component_id & sub_component_id as additionnal tags
|
||||||
|
# vendor_specific = []
|
||||||
|
|
||||||
## Define additional aliases to map encoding paths to measurement names
|
## Define additional aliases to map encoding paths to measurement names
|
||||||
# [inputs.gnmi.aliases]
|
# [inputs.gnmi.aliases]
|
||||||
# ifcounters = "openconfig:/interfaces/interface/state/counters"
|
# ifcounters = "openconfig:/interfaces/interface/state/counters"
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,380 @@
|
||||||
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// protoc-gen-go v1.30.0
|
||||||
|
// protoc v3.12.4
|
||||||
|
// source: GnmiJuniperTelemetryHeaderExtension.proto
|
||||||
|
|
||||||
|
package jnpr_gnmi_extention
|
||||||
|
|
||||||
|
import (
|
||||||
|
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
|
||||||
|
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
|
||||||
|
reflect "reflect"
|
||||||
|
sync "sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// Verify that this generated code is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
|
||||||
|
// Verify that runtime/protoimpl is sufficiently up-to-date.
|
||||||
|
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
|
||||||
|
)
|
||||||
|
|
||||||
|
type StreamType int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
StreamType_INITIAL_SYNC StreamType = 0
|
||||||
|
StreamType_ONCHANGE StreamType = 1
|
||||||
|
StreamType_PERIODIC StreamType = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
// Enum value maps for StreamType.
|
||||||
|
var (
|
||||||
|
StreamType_name = map[int32]string{
|
||||||
|
0: "INITIAL_SYNC",
|
||||||
|
1: "ONCHANGE",
|
||||||
|
2: "PERIODIC",
|
||||||
|
}
|
||||||
|
StreamType_value = map[string]int32{
|
||||||
|
"INITIAL_SYNC": 0,
|
||||||
|
"ONCHANGE": 1,
|
||||||
|
"PERIODIC": 2,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func (x StreamType) Enum() *StreamType {
|
||||||
|
p := new(StreamType)
|
||||||
|
*p = x
|
||||||
|
return p
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x StreamType) String() string {
|
||||||
|
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (StreamType) Descriptor() protoreflect.EnumDescriptor {
|
||||||
|
return file_GnmiJuniperTelemetryHeaderExtension_proto_enumTypes[0].Descriptor()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (StreamType) Type() protoreflect.EnumType {
|
||||||
|
return &file_GnmiJuniperTelemetryHeaderExtension_proto_enumTypes[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x StreamType) Number() protoreflect.EnumNumber {
|
||||||
|
return protoreflect.EnumNumber(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use StreamType.Descriptor instead.
|
||||||
|
func (StreamType) EnumDescriptor() ([]byte, []int) {
|
||||||
|
return file_GnmiJuniperTelemetryHeaderExtension_proto_rawDescGZIP(), []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Present as first gNMI update in all packets
|
||||||
|
type GnmiJuniperTelemetryHeaderExtension struct {
|
||||||
|
state protoimpl.MessageState
|
||||||
|
sizeCache protoimpl.SizeCache
|
||||||
|
unknownFields protoimpl.UnknownFields
|
||||||
|
|
||||||
|
// router name:export IP address
|
||||||
|
SystemId string `protobuf:"bytes,1,opt,name=system_id,json=systemId,proto3" json:"system_id,omitempty"`
|
||||||
|
// line card / RE (slot number)
|
||||||
|
ComponentId uint32 `protobuf:"varint,2,opt,name=component_id,json=componentId,proto3" json:"component_id,omitempty"`
|
||||||
|
// PFE (if applicable)
|
||||||
|
SubComponentId uint32 `protobuf:"varint,3,opt,name=sub_component_id,json=subComponentId,proto3" json:"sub_component_id,omitempty"`
|
||||||
|
// Internal sensor name
|
||||||
|
SensorName string `protobuf:"bytes,4,opt,name=sensor_name,json=sensorName,proto3" json:"sensor_name,omitempty"`
|
||||||
|
// Sensor path in the subscribe request
|
||||||
|
SubscribedPath string `protobuf:"bytes,5,opt,name=subscribed_path,json=subscribedPath,proto3" json:"subscribed_path,omitempty"`
|
||||||
|
// Internal sensor path in junos
|
||||||
|
StreamedPath string `protobuf:"bytes,6,opt,name=streamed_path,json=streamedPath,proto3" json:"streamed_path,omitempty"`
|
||||||
|
Component string `protobuf:"bytes,7,opt,name=component,proto3" json:"component,omitempty"`
|
||||||
|
// Sequence number, monotonically increasing for each
|
||||||
|
SequenceNumber uint64 `protobuf:"varint,8,opt,name=sequence_number,json=sequenceNumber,proto3" json:"sequence_number,omitempty"`
|
||||||
|
// Payload get timestamp in milliseconds
|
||||||
|
PayloadGetTimestamp int64 `protobuf:"varint,9,opt,name=payload_get_timestamp,json=payloadGetTimestamp,proto3" json:"payload_get_timestamp,omitempty"`
|
||||||
|
// Stream creation timestamp in milliseconds
|
||||||
|
StreamCreationTimestamp int64 `protobuf:"varint,10,opt,name=stream_creation_timestamp,json=streamCreationTimestamp,proto3" json:"stream_creation_timestamp,omitempty"`
|
||||||
|
// [Deprecated] Event timestamp in milliseconds
|
||||||
|
//
|
||||||
|
// Deprecated: Marked as deprecated in GnmiJuniperTelemetryHeaderExtension.proto.
|
||||||
|
EventTimestamp int64 `protobuf:"varint,11,opt,name=event_timestamp,json=eventTimestamp,proto3" json:"event_timestamp,omitempty"`
|
||||||
|
// Export timestamp in milliseconds
|
||||||
|
ExportTimestamp int64 `protobuf:"varint,12,opt,name=export_timestamp,json=exportTimestamp,proto3" json:"export_timestamp,omitempty"`
|
||||||
|
// Subsequence number
|
||||||
|
SubSequenceNumber uint64 `protobuf:"varint,13,opt,name=sub_sequence_number,json=subSequenceNumber,proto3" json:"sub_sequence_number,omitempty"`
|
||||||
|
// End of marker
|
||||||
|
Eom bool `protobuf:"varint,14,opt,name=eom,proto3" json:"eom,omitempty"`
|
||||||
|
// Event publish timestamp in milliseconds
|
||||||
|
EventPublishTimestamp int64 `protobuf:"varint,15,opt,name=event_publish_timestamp,json=eventPublishTimestamp,proto3" json:"event_publish_timestamp,omitempty"`
|
||||||
|
// Stream type of packet
|
||||||
|
StreamId StreamType `protobuf:"varint,16,opt,name=stream_id,json=streamId,proto3,enum=StreamType" json:"stream_id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) Reset() {
|
||||||
|
*x = GnmiJuniperTelemetryHeaderExtension{}
|
||||||
|
if protoimpl.UnsafeEnabled {
|
||||||
|
mi := &file_GnmiJuniperTelemetryHeaderExtension_proto_msgTypes[0]
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) String() string {
|
||||||
|
return protoimpl.X.MessageStringOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*GnmiJuniperTelemetryHeaderExtension) ProtoMessage() {}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) ProtoReflect() protoreflect.Message {
|
||||||
|
mi := &file_GnmiJuniperTelemetryHeaderExtension_proto_msgTypes[0]
|
||||||
|
if protoimpl.UnsafeEnabled && x != nil {
|
||||||
|
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
|
||||||
|
if ms.LoadMessageInfo() == nil {
|
||||||
|
ms.StoreMessageInfo(mi)
|
||||||
|
}
|
||||||
|
return ms
|
||||||
|
}
|
||||||
|
return mi.MessageOf(x)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Use GnmiJuniperTelemetryHeaderExtension.ProtoReflect.Descriptor instead.
|
||||||
|
func (*GnmiJuniperTelemetryHeaderExtension) Descriptor() ([]byte, []int) {
|
||||||
|
return file_GnmiJuniperTelemetryHeaderExtension_proto_rawDescGZIP(), []int{0}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetSystemId() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.SystemId
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetComponentId() uint32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.ComponentId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetSubComponentId() uint32 {
|
||||||
|
if x != nil {
|
||||||
|
return x.SubComponentId
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetSensorName() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.SensorName
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetSubscribedPath() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.SubscribedPath
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetStreamedPath() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.StreamedPath
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetComponent() string {
|
||||||
|
if x != nil {
|
||||||
|
return x.Component
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetSequenceNumber() uint64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.SequenceNumber
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetPayloadGetTimestamp() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.PayloadGetTimestamp
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetStreamCreationTimestamp() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.StreamCreationTimestamp
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deprecated: Marked as deprecated in GnmiJuniperTelemetryHeaderExtension.proto.
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetEventTimestamp() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.EventTimestamp
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetExportTimestamp() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.ExportTimestamp
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetSubSequenceNumber() uint64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.SubSequenceNumber
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetEom() bool {
|
||||||
|
if x != nil {
|
||||||
|
return x.Eom
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetEventPublishTimestamp() int64 {
|
||||||
|
if x != nil {
|
||||||
|
return x.EventPublishTimestamp
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (x *GnmiJuniperTelemetryHeaderExtension) GetStreamId() StreamType {
|
||||||
|
if x != nil {
|
||||||
|
return x.StreamId
|
||||||
|
}
|
||||||
|
return StreamType_INITIAL_SYNC
|
||||||
|
}
|
||||||
|
|
||||||
|
var File_GnmiJuniperTelemetryHeaderExtension_proto protoreflect.FileDescriptor
|
||||||
|
|
||||||
|
var file_GnmiJuniperTelemetryHeaderExtension_proto_rawDesc = []byte{
|
||||||
|
0x0a, 0x29, 0x47, 0x6e, 0x6d, 0x69, 0x4a, 0x75, 0x6e, 0x69, 0x70, 0x65, 0x72, 0x54, 0x65, 0x6c,
|
||||||
|
0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65,
|
||||||
|
0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb1, 0x05, 0x0a, 0x23,
|
||||||
|
0x47, 0x6e, 0x6d, 0x69, 0x4a, 0x75, 0x6e, 0x69, 0x70, 0x65, 0x72, 0x54, 0x65, 0x6c, 0x65, 0x6d,
|
||||||
|
0x65, 0x74, 0x72, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73,
|
||||||
|
0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x69, 0x64,
|
||||||
|
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x49, 0x64,
|
||||||
|
0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64,
|
||||||
|
0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e,
|
||||||
|
0x74, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x75, 0x62, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6f,
|
||||||
|
0x6e, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x73,
|
||||||
|
0x75, 0x62, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1f, 0x0a,
|
||||||
|
0x0b, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01,
|
||||||
|
0x28, 0x09, 0x52, 0x0a, 0x73, 0x65, 0x6e, 0x73, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x27,
|
||||||
|
0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x74,
|
||||||
|
0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69,
|
||||||
|
0x62, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x72, 0x65, 0x61,
|
||||||
|
0x6d, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c,
|
||||||
|
0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09,
|
||||||
|
0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52,
|
||||||
|
0x09, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x65,
|
||||||
|
0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x08, 0x20,
|
||||||
|
0x01, 0x28, 0x04, 0x52, 0x0e, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d,
|
||||||
|
0x62, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x67,
|
||||||
|
0x65, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x09, 0x20, 0x01,
|
||||||
|
0x28, 0x03, 0x52, 0x13, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x47, 0x65, 0x74, 0x54, 0x69,
|
||||||
|
0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x3a, 0x0a, 0x19, 0x73, 0x74, 0x72, 0x65, 0x61,
|
||||||
|
0x6d, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73,
|
||||||
|
0x74, 0x61, 0x6d, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x73, 0x74, 0x72, 0x65,
|
||||||
|
0x61, 0x6d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74,
|
||||||
|
0x61, 0x6d, 0x70, 0x12, 0x2b, 0x0a, 0x0f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x69, 0x6d,
|
||||||
|
0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01,
|
||||||
|
0x52, 0x0e, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
|
||||||
|
0x12, 0x29, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73,
|
||||||
|
0x74, 0x61, 0x6d, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x78, 0x70, 0x6f,
|
||||||
|
0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x13, 0x73,
|
||||||
|
0x75, 0x62, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62,
|
||||||
|
0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x73, 0x75, 0x62, 0x53, 0x65, 0x71,
|
||||||
|
0x75, 0x65, 0x6e, 0x63, 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x65,
|
||||||
|
0x6f, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x65, 0x6f, 0x6d, 0x12, 0x36, 0x0a,
|
||||||
|
0x17, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x74,
|
||||||
|
0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15,
|
||||||
|
0x65, 0x76, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65,
|
||||||
|
0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x28, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f,
|
||||||
|
0x69, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0b, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61,
|
||||||
|
0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x49, 0x64, 0x2a,
|
||||||
|
0x3a, 0x0a, 0x0a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a,
|
||||||
|
0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x00, 0x12,
|
||||||
|
0x0c, 0x0a, 0x08, 0x4f, 0x4e, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x01, 0x12, 0x0c, 0x0a,
|
||||||
|
0x08, 0x50, 0x45, 0x52, 0x49, 0x4f, 0x44, 0x49, 0x43, 0x10, 0x02, 0x42, 0x17, 0x5a, 0x15, 0x2e,
|
||||||
|
0x3b, 0x6a, 0x6e, 0x70, 0x72, 0x5f, 0x67, 0x6e, 0x6d, 0x69, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x6e,
|
||||||
|
0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
|
||||||
|
}
|
||||||
|
|
||||||
|
var (
|
||||||
|
file_GnmiJuniperTelemetryHeaderExtension_proto_rawDescOnce sync.Once
|
||||||
|
file_GnmiJuniperTelemetryHeaderExtension_proto_rawDescData = file_GnmiJuniperTelemetryHeaderExtension_proto_rawDesc
|
||||||
|
)
|
||||||
|
|
||||||
|
func file_GnmiJuniperTelemetryHeaderExtension_proto_rawDescGZIP() []byte {
|
||||||
|
file_GnmiJuniperTelemetryHeaderExtension_proto_rawDescOnce.Do(func() {
|
||||||
|
file_GnmiJuniperTelemetryHeaderExtension_proto_rawDescData = protoimpl.X.CompressGZIP(file_GnmiJuniperTelemetryHeaderExtension_proto_rawDescData)
|
||||||
|
})
|
||||||
|
return file_GnmiJuniperTelemetryHeaderExtension_proto_rawDescData
|
||||||
|
}
|
||||||
|
|
||||||
|
var file_GnmiJuniperTelemetryHeaderExtension_proto_enumTypes = make([]protoimpl.EnumInfo, 1)
|
||||||
|
var file_GnmiJuniperTelemetryHeaderExtension_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
|
||||||
|
var file_GnmiJuniperTelemetryHeaderExtension_proto_goTypes = []interface{}{
|
||||||
|
(StreamType)(0), // 0: StreamType
|
||||||
|
(*GnmiJuniperTelemetryHeaderExtension)(nil), // 1: GnmiJuniperTelemetryHeaderExtension
|
||||||
|
}
|
||||||
|
var file_GnmiJuniperTelemetryHeaderExtension_proto_depIdxs = []int32{
|
||||||
|
0, // 0: GnmiJuniperTelemetryHeaderExtension.stream_id:type_name -> StreamType
|
||||||
|
1, // [1:1] is the sub-list for method output_type
|
||||||
|
1, // [1:1] is the sub-list for method input_type
|
||||||
|
1, // [1:1] is the sub-list for extension type_name
|
||||||
|
1, // [1:1] is the sub-list for extension extendee
|
||||||
|
0, // [0:1] is the sub-list for field type_name
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { file_GnmiJuniperTelemetryHeaderExtension_proto_init() }
|
||||||
|
func file_GnmiJuniperTelemetryHeaderExtension_proto_init() {
|
||||||
|
if File_GnmiJuniperTelemetryHeaderExtension_proto != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if !protoimpl.UnsafeEnabled {
|
||||||
|
file_GnmiJuniperTelemetryHeaderExtension_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
|
||||||
|
switch v := v.(*GnmiJuniperTelemetryHeaderExtension); i {
|
||||||
|
case 0:
|
||||||
|
return &v.state
|
||||||
|
case 1:
|
||||||
|
return &v.sizeCache
|
||||||
|
case 2:
|
||||||
|
return &v.unknownFields
|
||||||
|
default:
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
type x struct{}
|
||||||
|
out := protoimpl.TypeBuilder{
|
||||||
|
File: protoimpl.DescBuilder{
|
||||||
|
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
|
||||||
|
RawDescriptor: file_GnmiJuniperTelemetryHeaderExtension_proto_rawDesc,
|
||||||
|
NumEnums: 1,
|
||||||
|
NumMessages: 1,
|
||||||
|
NumExtensions: 0,
|
||||||
|
NumServices: 0,
|
||||||
|
},
|
||||||
|
GoTypes: file_GnmiJuniperTelemetryHeaderExtension_proto_goTypes,
|
||||||
|
DependencyIndexes: file_GnmiJuniperTelemetryHeaderExtension_proto_depIdxs,
|
||||||
|
EnumInfos: file_GnmiJuniperTelemetryHeaderExtension_proto_enumTypes,
|
||||||
|
MessageInfos: file_GnmiJuniperTelemetryHeaderExtension_proto_msgTypes,
|
||||||
|
}.Build()
|
||||||
|
File_GnmiJuniperTelemetryHeaderExtension_proto = out.File
|
||||||
|
file_GnmiJuniperTelemetryHeaderExtension_proto_rawDesc = nil
|
||||||
|
file_GnmiJuniperTelemetryHeaderExtension_proto_goTypes = nil
|
||||||
|
file_GnmiJuniperTelemetryHeaderExtension_proto_depIdxs = nil
|
||||||
|
}
|
||||||
|
|
@ -18,6 +18,7 @@ import (
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/config"
|
"github.com/influxdata/telegraf/config"
|
||||||
|
"github.com/influxdata/telegraf/internal/choice"
|
||||||
internaltls "github.com/influxdata/telegraf/plugins/common/tls"
|
internaltls "github.com/influxdata/telegraf/plugins/common/tls"
|
||||||
"github.com/influxdata/telegraf/plugins/inputs"
|
"github.com/influxdata/telegraf/plugins/inputs"
|
||||||
)
|
)
|
||||||
|
|
@ -36,6 +37,9 @@ device model and the following response data:
|
||||||
%+v
|
%+v
|
||||||
This message is only printed once.`
|
This message is only printed once.`
|
||||||
|
|
||||||
|
// Currently supported GNMI Extensions
|
||||||
|
var supportedExtensions = []string{"juniper_header"}
|
||||||
|
|
||||||
// gNMI plugin instance
|
// gNMI plugin instance
|
||||||
type GNMI struct {
|
type GNMI struct {
|
||||||
Addresses []string `toml:"addresses"`
|
Addresses []string `toml:"addresses"`
|
||||||
|
|
@ -47,6 +51,7 @@ type GNMI struct {
|
||||||
Prefix string `toml:"prefix"`
|
Prefix string `toml:"prefix"`
|
||||||
Target string `toml:"target"`
|
Target string `toml:"target"`
|
||||||
UpdatesOnly bool `toml:"updates_only"`
|
UpdatesOnly bool `toml:"updates_only"`
|
||||||
|
VendorSpecific []string `toml:"vendor_specific"`
|
||||||
Username string `toml:"username"`
|
Username string `toml:"username"`
|
||||||
Password string `toml:"password"`
|
Password string `toml:"password"`
|
||||||
Redial config.Duration `toml:"redial"`
|
Redial config.Duration `toml:"redial"`
|
||||||
|
|
@ -187,7 +192,15 @@ func (c *GNMI) Start(acc telegraf.Accumulator) error {
|
||||||
for _, addr := range c.Addresses {
|
for _, addr := range c.Addresses {
|
||||||
go func(addr string) {
|
go func(addr string) {
|
||||||
defer c.wg.Done()
|
defer c.wg.Done()
|
||||||
h := newHandler(addr, c.internalAliases, c.TagSubscriptions, int(c.MaxMsgSize), c.Log, c.Trace)
|
confHandler := configHandler{
|
||||||
|
aliases: c.internalAliases,
|
||||||
|
subscriptions: c.TagSubscriptions,
|
||||||
|
maxSize: int(c.MaxMsgSize),
|
||||||
|
log: c.Log,
|
||||||
|
trace: c.Trace,
|
||||||
|
vendorExt: c.VendorSpecific,
|
||||||
|
}
|
||||||
|
h := newHandler(addr, confHandler)
|
||||||
for ctx.Err() == nil {
|
for ctx.Err() == nil {
|
||||||
if err := h.subscribeGNMI(ctx, acc, tlscfg, request); err != nil && ctx.Err() == nil {
|
if err := h.subscribeGNMI(ctx, acc, tlscfg, request); err != nil && ctx.Err() == nil {
|
||||||
acc.AddError(err)
|
acc.AddError(err)
|
||||||
|
|
@ -304,6 +317,14 @@ func init() {
|
||||||
inputs.Add("cisco_telemetry_gnmi", New)
|
inputs.Add("cisco_telemetry_gnmi", New)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *GNMI) Init() error {
|
||||||
|
// Check vendor_specific options configured by user
|
||||||
|
if err := choice.CheckSlice(c.VendorSpecific, supportedExtensions); err != nil {
|
||||||
|
return fmt.Errorf("unsupported vendor_specific option: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *Subscription) buildFullPath(c *GNMI) error {
|
func (s *Subscription) buildFullPath(c *GNMI) error {
|
||||||
var err error
|
var err error
|
||||||
if s.fullPath, err = xpath.ToGNMIPath(s.Path); err != nil {
|
if s.fullPath, err = xpath.ToGNMIPath(s.Path); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -13,14 +13,17 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
gnmiLib "github.com/openconfig/gnmi/proto/gnmi"
|
gnmiLib "github.com/openconfig/gnmi/proto/gnmi"
|
||||||
|
gnmiExt "github.com/openconfig/gnmi/proto/gnmi_ext"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/metadata"
|
"google.golang.org/grpc/metadata"
|
||||||
"google.golang.org/protobuf/encoding/protojson"
|
"google.golang.org/protobuf/encoding/protojson"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/config"
|
"github.com/influxdata/telegraf/config"
|
||||||
"github.com/influxdata/telegraf/plugins/inputs"
|
"github.com/influxdata/telegraf/plugins/inputs"
|
||||||
|
jnprHeader "github.com/influxdata/telegraf/plugins/inputs/gnmi/extensions/jnpr_gnmi_extention"
|
||||||
"github.com/influxdata/telegraf/plugins/parsers/influx"
|
"github.com/influxdata/telegraf/plugins/parsers/influx"
|
||||||
"github.com/influxdata/telegraf/testutil"
|
"github.com/influxdata/telegraf/testutil"
|
||||||
)
|
)
|
||||||
|
|
@ -903,6 +906,91 @@ func TestNotification(t *testing.T) {
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
name: "Juniper Extension",
|
||||||
|
plugin: &GNMI{
|
||||||
|
Log: testutil.Logger{},
|
||||||
|
Encoding: "proto",
|
||||||
|
VendorSpecific: []string{"juniper_header"},
|
||||||
|
Redial: config.Duration(1 * time.Second),
|
||||||
|
Subscriptions: []Subscription{
|
||||||
|
{
|
||||||
|
Name: "type",
|
||||||
|
Origin: "openconfig-platform",
|
||||||
|
Path: "/components/component[name=CHASSIS0:FPC0]/state",
|
||||||
|
SubscriptionMode: "sample",
|
||||||
|
SampleInterval: config.Duration(1 * time.Second),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
server: &MockServer{
|
||||||
|
SubscribeF: func(server gnmiLib.GNMI_SubscribeServer) error {
|
||||||
|
if err := server.Send(&gnmiLib.SubscribeResponse{Response: &gnmiLib.SubscribeResponse_SyncResponse{SyncResponse: true}}); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
response := &gnmiLib.SubscribeResponse{
|
||||||
|
Response: &gnmiLib.SubscribeResponse_Update{
|
||||||
|
Update: &gnmiLib.Notification{
|
||||||
|
Timestamp: 1668771585733542546,
|
||||||
|
Prefix: &gnmiLib.Path{
|
||||||
|
Elem: []*gnmiLib.PathElem{
|
||||||
|
{Name: "openconfig-platform:components"},
|
||||||
|
{Name: "component", Key: map[string]string{"name": "CHASSIS0:FPC0"}},
|
||||||
|
{Name: "state"},
|
||||||
|
},
|
||||||
|
Target: "OC-YANG",
|
||||||
|
},
|
||||||
|
Update: []*gnmiLib.Update{
|
||||||
|
{
|
||||||
|
Path: &gnmiLib.Path{
|
||||||
|
Elem: []*gnmiLib.PathElem{
|
||||||
|
{Name: "type"},
|
||||||
|
}},
|
||||||
|
Val: &gnmiLib.TypedValue{
|
||||||
|
Value: &gnmiLib.TypedValue_StringVal{StringVal: "LINECARD"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Extension: []*gnmiExt.Extension{{
|
||||||
|
Ext: &gnmiExt.Extension_RegisteredExt{
|
||||||
|
RegisteredExt: &gnmiExt.RegisteredExtension{
|
||||||
|
// Juniper Header Extension
|
||||||
|
//EID_JUNIPER_TELEMETRY_HEADER = 1;
|
||||||
|
Id: 1,
|
||||||
|
Msg: func(jnprExt *jnprHeader.GnmiJuniperTelemetryHeaderExtension) []byte {
|
||||||
|
b, err := proto.Marshal(jnprExt)
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}(&jnprHeader.GnmiJuniperTelemetryHeaderExtension{ComponentId: 15, SubComponentId: 1, Component: "PICD"}),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
return server.Send(response)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expected: []telegraf.Metric{
|
||||||
|
testutil.MustMetric(
|
||||||
|
"type",
|
||||||
|
map[string]string{
|
||||||
|
"path": "openconfig-platform:/components/component/state",
|
||||||
|
"source": "127.0.0.1",
|
||||||
|
"name": "CHASSIS0:FPC0",
|
||||||
|
"component_id": "15",
|
||||||
|
"sub_component_id": "1",
|
||||||
|
"component": "PICD",
|
||||||
|
},
|
||||||
|
map[string]interface{}{
|
||||||
|
"type": "LINECARD",
|
||||||
|
},
|
||||||
|
time.Unix(0, 0),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tt := range tests {
|
for _, tt := range tests {
|
||||||
|
|
|
||||||
|
|
@ -12,34 +12,52 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/influxdata/telegraf"
|
"github.com/influxdata/telegraf"
|
||||||
|
"github.com/influxdata/telegraf/internal/choice"
|
||||||
"github.com/influxdata/telegraf/metric"
|
"github.com/influxdata/telegraf/metric"
|
||||||
|
jnprHeader "github.com/influxdata/telegraf/plugins/inputs/gnmi/extensions/jnpr_gnmi_extention"
|
||||||
gnmiLib "github.com/openconfig/gnmi/proto/gnmi"
|
gnmiLib "github.com/openconfig/gnmi/proto/gnmi"
|
||||||
|
gnmiExt "github.com/openconfig/gnmi/proto/gnmi_ext"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/credentials"
|
"google.golang.org/grpc/credentials"
|
||||||
"google.golang.org/grpc/credentials/insecure"
|
"google.golang.org/grpc/credentials/insecure"
|
||||||
"google.golang.org/protobuf/encoding/protojson"
|
"google.golang.org/protobuf/encoding/protojson"
|
||||||
|
"google.golang.org/protobuf/proto"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const eidJuniperTelemetryHeader = 1
|
||||||
|
|
||||||
type handler struct {
|
type handler struct {
|
||||||
address string
|
address string
|
||||||
aliases map[string]string
|
aliases map[string]string
|
||||||
tagsubs []TagSubscription
|
tagsubs []TagSubscription
|
||||||
maxMsgSize int
|
maxMsgSize int
|
||||||
emptyNameWarnShown bool
|
emptyNameWarnShown bool
|
||||||
|
vendorExt []string
|
||||||
tagStore *tagStore
|
tagStore *tagStore
|
||||||
trace bool
|
trace bool
|
||||||
log telegraf.Logger
|
log telegraf.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func newHandler(addr string, aliases map[string]string, subs []TagSubscription, maxsize int, l telegraf.Logger, trace bool) *handler {
|
// Allow to convey additionnal configuration elements
|
||||||
|
type configHandler struct {
|
||||||
|
aliases map[string]string
|
||||||
|
subscriptions []TagSubscription
|
||||||
|
maxSize int
|
||||||
|
log telegraf.Logger
|
||||||
|
trace bool
|
||||||
|
vendorExt []string
|
||||||
|
}
|
||||||
|
|
||||||
|
func newHandler(addr string, confHandler configHandler) *handler {
|
||||||
return &handler{
|
return &handler{
|
||||||
address: addr,
|
address: addr,
|
||||||
aliases: aliases,
|
aliases: confHandler.aliases,
|
||||||
tagsubs: subs,
|
tagsubs: confHandler.subscriptions,
|
||||||
maxMsgSize: maxsize,
|
maxMsgSize: confHandler.maxSize,
|
||||||
tagStore: newTagStore(subs),
|
vendorExt: confHandler.vendorExt,
|
||||||
trace: trace,
|
tagStore: newTagStore(confHandler.subscriptions),
|
||||||
log: l,
|
trace: confHandler.trace,
|
||||||
|
log: confHandler.log,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -98,21 +116,52 @@ func (h *handler) subscribeGNMI(ctx context.Context, acc telegraf.Accumulator, t
|
||||||
h.log.Debugf("update_%v: %s", t, string(buf))
|
h.log.Debugf("update_%v: %s", t, string(buf))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if response, ok := reply.Response.(*gnmiLib.SubscribeResponse_Update); ok {
|
if response, ok := reply.Response.(*gnmiLib.SubscribeResponse_Update); ok {
|
||||||
h.handleSubscribeResponseUpdate(acc, response)
|
h.handleSubscribeResponseUpdate(acc, response, reply.GetExtension())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Handle SubscribeResponse_Update message from gNMI and parse contained telemetry data
|
// Handle SubscribeResponse_Update message from gNMI and parse contained telemetry data
|
||||||
func (h *handler) handleSubscribeResponseUpdate(acc telegraf.Accumulator, response *gnmiLib.SubscribeResponse_Update) {
|
func (h *handler) handleSubscribeResponseUpdate(acc telegraf.Accumulator, response *gnmiLib.SubscribeResponse_Update, extension []*gnmiExt.Extension) {
|
||||||
var prefix, prefixAliasPath string
|
var prefix, prefixAliasPath string
|
||||||
grouper := metric.NewSeriesGrouper()
|
grouper := metric.NewSeriesGrouper()
|
||||||
timestamp := time.Unix(0, response.Update.Timestamp)
|
timestamp := time.Unix(0, response.Update.Timestamp)
|
||||||
prefixTags := make(map[string]string)
|
prefixTags := make(map[string]string)
|
||||||
|
|
||||||
|
// iter on each extension
|
||||||
|
for _, ext := range extension {
|
||||||
|
currentExt := ext.GetRegisteredExt().Msg
|
||||||
|
if currentExt == nil {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// extension ID
|
||||||
|
switch ext.GetRegisteredExt().Id {
|
||||||
|
// Juniper Header extention
|
||||||
|
//EID_JUNIPER_TELEMETRY_HEADER = 1;
|
||||||
|
case eidJuniperTelemetryHeader:
|
||||||
|
// Decode it only if user requested it
|
||||||
|
if choice.Contains("juniper_header", h.vendorExt) {
|
||||||
|
juniperHeader := &jnprHeader.GnmiJuniperTelemetryHeaderExtension{}
|
||||||
|
// unmarshal extention
|
||||||
|
err := proto.Unmarshal(currentExt, juniperHeader)
|
||||||
|
if err != nil {
|
||||||
|
h.log.Errorf("unmarshal gnmi Juniper Header extention failed: %w", err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
// Add only relevant Tags from the Juniper Header extention.
|
||||||
|
// These are requiered for aggregation
|
||||||
|
prefixTags["component_id"] = fmt.Sprint(juniperHeader.GetComponentId())
|
||||||
|
prefixTags["component"] = fmt.Sprint(juniperHeader.GetComponent())
|
||||||
|
prefixTags["sub_component_id"] = fmt.Sprint(juniperHeader.GetSubComponentId())
|
||||||
|
}
|
||||||
|
|
||||||
|
default:
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if response.Update.Prefix != nil {
|
if response.Update.Prefix != nil {
|
||||||
var err error
|
var err error
|
||||||
if prefix, prefixAliasPath, err = handlePath(response.Update.Prefix, prefixTags, h.aliases, ""); err != nil {
|
if prefix, prefixAliasPath, err = handlePath(response.Update.Prefix, prefixTags, h.aliases, ""); err != nil {
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,14 @@
|
||||||
# prefix = ""
|
# prefix = ""
|
||||||
# target = ""
|
# target = ""
|
||||||
|
|
||||||
|
## Vendor specific options
|
||||||
|
## This defines what vendor specific options to load.
|
||||||
|
## * Juniper Header Extension (juniper_header): some sensors are directly managed by
|
||||||
|
## Linecard, which adds the Juniper GNMI Header Extension. Enabling this
|
||||||
|
## allows the decoding of the Extension header if present. Currently this knob
|
||||||
|
## adds component, component_id & sub_component_id as additionnal tags
|
||||||
|
# vendor_specific = []
|
||||||
|
|
||||||
## Define additional aliases to map encoding paths to measurement names
|
## Define additional aliases to map encoding paths to measurement names
|
||||||
# [inputs.gnmi.aliases]
|
# [inputs.gnmi.aliases]
|
||||||
# ifcounters = "openconfig:/interfaces/interface/state/counters"
|
# ifcounters = "openconfig:/interfaces/interface/state/counters"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue