fix(parsers.xpath): Allow resolving extensions (#15586)
This commit is contained in:
parent
2b2f826ac0
commit
94e45a1e66
|
|
@ -24,9 +24,9 @@ lib]. The only exception are _integer_ fields that need to be specified in a
|
||||||
For using the protocol-buffer format you need to specify additional
|
For using the protocol-buffer format you need to specify additional
|
||||||
(_mandatory_) properties for the parser. Those options are described here.
|
(_mandatory_) properties for the parser. Those options are described here.
|
||||||
|
|
||||||
#### `xpath_protobuf_file` (mandatory)
|
#### `xpath_protobuf_files` (mandatory)
|
||||||
|
|
||||||
Use this option to specify the name of the protocol-buffer definition file
|
Use this option to specify the name of the protocol-buffer definition files
|
||||||
(`.proto`).
|
(`.proto`).
|
||||||
|
|
||||||
#### `xpath_protobuf_type` (mandatory)
|
#### `xpath_protobuf_type` (mandatory)
|
||||||
|
|
@ -67,7 +67,7 @@ You should use the following setting
|
||||||
files = ["example.dat"]
|
files = ["example.dat"]
|
||||||
|
|
||||||
data_format = "xpath_protobuf"
|
data_format = "xpath_protobuf"
|
||||||
xpath_protobuf_file = "A.proto"
|
xpath_protobuf_files = ["A.proto"]
|
||||||
xpath_protobuf_type = "foo.Measurement"
|
xpath_protobuf_type = "foo.Measurement"
|
||||||
xpath_protobuf_import_paths = [".", "/data/my_proto_files"]
|
xpath_protobuf_import_paths = [".", "/data/my_proto_files"]
|
||||||
|
|
||||||
|
|
@ -114,7 +114,7 @@ XPath expressions.
|
||||||
|
|
||||||
## PROTOCOL-BUFFER definitions
|
## PROTOCOL-BUFFER definitions
|
||||||
## Protocol-buffer definition file
|
## Protocol-buffer definition file
|
||||||
# xpath_protobuf_file = "sparkplug_b.proto"
|
# xpath_protobuf_files = ["sparkplug_b.proto"]
|
||||||
## Name of the protocol-buffer message type to use in a fully qualified form.
|
## Name of the protocol-buffer message type to use in a fully qualified form.
|
||||||
# xpath_protobuf_type = "org.eclipse.tahu.protobuf.Payload"
|
# xpath_protobuf_type = "org.eclipse.tahu.protobuf.Payload"
|
||||||
## List of paths to use when looking up imported protocol-buffer definition files.
|
## List of paths to use when looking up imported protocol-buffer definition files.
|
||||||
|
|
@ -218,7 +218,7 @@ in the metric.
|
||||||
|
|
||||||
## PROTOCOL-BUFFER definitions
|
## PROTOCOL-BUFFER definitions
|
||||||
## Protocol-buffer definition file
|
## Protocol-buffer definition file
|
||||||
# xpath_protobuf_file = "sparkplug_b.proto"
|
# xpath_protobuf_file = ["sparkplug_b.proto"]
|
||||||
## Name of the protocol-buffer message type to use in a fully qualified form.
|
## Name of the protocol-buffer message type to use in a fully qualified form.
|
||||||
# xpath_protobuf_type = "org.eclipse.tahu.protobuf.Payload"
|
# xpath_protobuf_type = "org.eclipse.tahu.protobuf.Payload"
|
||||||
## List of paths to use when looking up imported protocol-buffer definition files.
|
## List of paths to use when looking up imported protocol-buffer definition files.
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"slices"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
@ -35,19 +36,20 @@ type dataDocument interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type Parser struct {
|
type Parser struct {
|
||||||
Format string `toml:"-"`
|
Format string `toml:"-"`
|
||||||
ProtobufMessageDef string `toml:"xpath_protobuf_file"`
|
ProtobufMessageFiles []string `toml:"xpath_protobuf_files"`
|
||||||
ProtobufMessageType string `toml:"xpath_protobuf_type"`
|
ProtobufMessageDef string `toml:"xpath_protobuf_file" deprecated:"1.32.0;1.40.0;use 'xpath_protobuf_files' instead"`
|
||||||
ProtobufImportPaths []string `toml:"xpath_protobuf_import_paths"`
|
ProtobufMessageType string `toml:"xpath_protobuf_type"`
|
||||||
ProtobufSkipBytes int64 `toml:"xpath_protobuf_skip_bytes"`
|
ProtobufImportPaths []string `toml:"xpath_protobuf_import_paths"`
|
||||||
PrintDocument bool `toml:"xpath_print_document"`
|
ProtobufSkipBytes int64 `toml:"xpath_protobuf_skip_bytes"`
|
||||||
AllowEmptySelection bool `toml:"xpath_allow_empty_selection"`
|
PrintDocument bool `toml:"xpath_print_document"`
|
||||||
NativeTypes bool `toml:"xpath_native_types"`
|
AllowEmptySelection bool `toml:"xpath_allow_empty_selection"`
|
||||||
Trace bool `toml:"xpath_trace"`
|
NativeTypes bool `toml:"xpath_native_types"`
|
||||||
Configs []Config `toml:"xpath"`
|
Trace bool `toml:"xpath_trace"`
|
||||||
DefaultMetricName string `toml:"-"`
|
Configs []Config `toml:"xpath"`
|
||||||
DefaultTags map[string]string `toml:"-"`
|
DefaultMetricName string `toml:"-"`
|
||||||
Log telegraf.Logger `toml:"-"`
|
DefaultTags map[string]string `toml:"-"`
|
||||||
|
Log telegraf.Logger `toml:"-"`
|
||||||
|
|
||||||
// Required for backward compatibility
|
// Required for backward compatibility
|
||||||
ConfigsXML []Config `toml:"xml" deprecated:"1.23.1;1.35.0;use 'xpath' instead"`
|
ConfigsXML []Config `toml:"xml" deprecated:"1.23.1;1.35.0;use 'xpath' instead"`
|
||||||
|
|
@ -126,12 +128,15 @@ func (p *Parser) Init() error {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
case "xpath_protobuf":
|
case "xpath_protobuf":
|
||||||
|
if p.ProtobufMessageDef != "" && !slices.Contains(p.ProtobufMessageFiles, p.ProtobufMessageDef) {
|
||||||
|
p.ProtobufMessageFiles = append(p.ProtobufMessageFiles, p.ProtobufMessageDef)
|
||||||
|
}
|
||||||
pbdoc := protobufDocument{
|
pbdoc := protobufDocument{
|
||||||
MessageDefinition: p.ProtobufMessageDef,
|
MessageFiles: p.ProtobufMessageFiles,
|
||||||
MessageType: p.ProtobufMessageType,
|
MessageType: p.ProtobufMessageType,
|
||||||
ImportPaths: p.ProtobufImportPaths,
|
ImportPaths: p.ProtobufImportPaths,
|
||||||
SkipBytes: p.ProtobufSkipBytes,
|
SkipBytes: p.ProtobufSkipBytes,
|
||||||
Log: p.Log,
|
Log: p.Log,
|
||||||
}
|
}
|
||||||
if err := pbdoc.Init(); err != nil {
|
if err := pbdoc.Init(); err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"github.com/jhump/protoreflect/desc"
|
"github.com/jhump/protoreflect/desc"
|
||||||
"github.com/jhump/protoreflect/desc/protoparse"
|
"github.com/jhump/protoreflect/desc/protoparse"
|
||||||
"github.com/srebhan/protobufquery"
|
"github.com/srebhan/protobufquery"
|
||||||
|
"google.golang.org/protobuf/encoding/protowire"
|
||||||
"google.golang.org/protobuf/proto"
|
"google.golang.org/protobuf/proto"
|
||||||
"google.golang.org/protobuf/reflect/protodesc"
|
"google.golang.org/protobuf/reflect/protodesc"
|
||||||
"google.golang.org/protobuf/reflect/protoreflect"
|
"google.golang.org/protobuf/reflect/protoreflect"
|
||||||
|
|
@ -22,18 +23,20 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type protobufDocument struct {
|
type protobufDocument struct {
|
||||||
MessageDefinition string
|
MessageFiles []string
|
||||||
MessageType string
|
MessageType string
|
||||||
ImportPaths []string
|
ImportPaths []string
|
||||||
SkipBytes int64
|
SkipBytes int64
|
||||||
Log telegraf.Logger
|
Log telegraf.Logger
|
||||||
msg *dynamicpb.Message
|
|
||||||
|
msg *dynamicpb.Message
|
||||||
|
unmarshaller proto.UnmarshalOptions
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *protobufDocument) Init() error {
|
func (d *protobufDocument) Init() error {
|
||||||
// Check the message definition and type
|
// Check the message definition and type
|
||||||
if d.MessageDefinition == "" {
|
if len(d.MessageFiles) == 0 {
|
||||||
return errors.New("protocol-buffer message-definition not set")
|
return errors.New("protocol-buffer files not set")
|
||||||
}
|
}
|
||||||
if d.MessageType == "" {
|
if d.MessageType == "" {
|
||||||
return errors.New("protocol-buffer message-type not set")
|
return errors.New("protocol-buffer message-type not set")
|
||||||
|
|
@ -44,12 +47,12 @@ func (d *protobufDocument) Init() error {
|
||||||
ImportPaths: d.ImportPaths,
|
ImportPaths: d.ImportPaths,
|
||||||
InferImportPaths: true,
|
InferImportPaths: true,
|
||||||
}
|
}
|
||||||
fds, err := parser.ParseFiles(d.MessageDefinition)
|
fds, err := parser.ParseFiles(d.MessageFiles...)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("parsing protocol-buffer definition in %q failed: %w", d.MessageDefinition, err)
|
return fmt.Errorf("parsing protocol-buffer definition failed: %w", err)
|
||||||
}
|
}
|
||||||
if len(fds) < 1 {
|
if len(fds) < 1 {
|
||||||
return fmt.Errorf("file %q does not contain file descriptors", d.MessageDefinition)
|
return errors.New("files do not contain a file descriptor")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register all definitions in the file in the global registry
|
// Register all definitions in the file in the global registry
|
||||||
|
|
@ -57,6 +60,10 @@ func (d *protobufDocument) Init() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("constructing registry failed: %w", err)
|
return fmt.Errorf("constructing registry failed: %w", err)
|
||||||
}
|
}
|
||||||
|
d.unmarshaller = proto.UnmarshalOptions{
|
||||||
|
RecursionLimit: protowire.DefaultRecursionLimit,
|
||||||
|
Resolver: dynamicpb.NewTypes(registry),
|
||||||
|
}
|
||||||
|
|
||||||
// Lookup given type in the loaded file descriptors
|
// Lookup given type in the loaded file descriptors
|
||||||
msgFullName := protoreflect.FullName(d.MessageType)
|
msgFullName := protoreflect.FullName(d.MessageType)
|
||||||
|
|
@ -97,7 +104,7 @@ func (d *protobufDocument) Parse(buf []byte) (dataNode, error) {
|
||||||
msg := d.msg.New()
|
msg := d.msg.New()
|
||||||
|
|
||||||
// Unmarshal the received buffer
|
// Unmarshal the received buffer
|
||||||
if err := proto.Unmarshal(buf[d.SkipBytes:], msg.Interface()); err != nil {
|
if err := d.unmarshaller.Unmarshal(buf[d.SkipBytes:], msg.Interface()); err != nil {
|
||||||
hexbuf := hex.EncodeToString(buf)
|
hexbuf := hex.EncodeToString(buf)
|
||||||
d.Log.Debugf("raw data (hex): %q (skip %d bytes)", hexbuf, d.SkipBytes)
|
d.Log.Debugf("raw data (hex): %q (skip %d bytes)", hexbuf, d.SkipBytes)
|
||||||
return nil, err
|
return nil, err
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
data_format = "xpath_protobuf"
|
data_format = "xpath_protobuf"
|
||||||
xpath_native_types = true
|
xpath_native_types = true
|
||||||
|
|
||||||
xpath_protobuf_file = "message.proto"
|
xpath_protobuf_files = ["message.proto"]
|
||||||
xpath_protobuf_type = "native_type.Message"
|
xpath_protobuf_type = "native_type.Message"
|
||||||
xpath_protobuf_import_paths = [".", "./testcases/native_types_protobuf"]
|
xpath_protobuf_import_paths = [".", "./testcases/native_types_protobuf"]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,7 +2,7 @@
|
||||||
files = ["./testcases/protobuf_benchmark/message.bin"]
|
files = ["./testcases/protobuf_benchmark/message.bin"]
|
||||||
data_format = "xpath_protobuf"
|
data_format = "xpath_protobuf"
|
||||||
|
|
||||||
xpath_protobuf_file = "benchmark.proto"
|
xpath_protobuf_files = ["benchmark.proto"]
|
||||||
xpath_protobuf_type = "benchmark.BenchmarkData"
|
xpath_protobuf_type = "benchmark.BenchmarkData"
|
||||||
xpath_protobuf_import_paths = [".", "./testcases/protobuf_benchmark"]
|
xpath_protobuf_import_paths = [".", "./testcases/protobuf_benchmark"]
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
data_format = "xpath_protobuf"
|
data_format = "xpath_protobuf"
|
||||||
|
|
||||||
xpath_native_types = true
|
xpath_native_types = true
|
||||||
xpath_protobuf_file = "issue.proto"
|
xpath_protobuf_files = ["issue.proto"]
|
||||||
xpath_protobuf_type = "dunedaq.ersschema.IssueChain"
|
xpath_protobuf_type = "dunedaq.ersschema.IssueChain"
|
||||||
xpath_protobuf_import_paths = [".", "./testcases/protobuf_issue_13715"]
|
xpath_protobuf_import_paths = [".", "./testcases/protobuf_issue_13715"]
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1 @@
|
||||||
|
test component_id=0u,enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name="ge-0/0/0",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_1="ge-0/0/1",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_10="ge-0/0/0",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_11="ge-0/0/1",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_12="ge-0/0/0",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_13="ge-0/0/1",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_14="ge-0/0/0",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_15="ge-0/0/1",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_16="ge-0/0/0",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_17="ge-0/0/1",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_18="ge-0/0/0",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_19="ge-0/0/1",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_2="ge-0/0/0",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_3="ge-0/0/1",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_4="ge-0/0/0",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_5="ge-0/0/1",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_6="ge-0/0/0",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_7="ge-0/0/1",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_8="ge-0/0/0",enterprise_juniperNetworks_jnpr_interface_ext_interface_stats_if_name_9="ge-0/0/1",sensor_name="ROUTER-INF:/junos/system/linecard/interface/:/junos/system/linecard/interface/:PFE",sequence_number=103837u,sub_component_id=0u,system_id="ST-Justin:10.55.60.125",timestamp=1719150965216u,version_major=1u,version_minor=1u 1719150965216000000
|
||||||
Binary file not shown.
|
|
@ -0,0 +1,226 @@
|
||||||
|
//
|
||||||
|
// Copyrights (c) 2015, 2016, Juniper Networks, Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Nitin Kumar, Jan 2015
|
||||||
|
//
|
||||||
|
// This file defines the messages in Protocol Buffers format used by
|
||||||
|
// the port sensor. The-top level messages is Port.
|
||||||
|
//
|
||||||
|
// Version 1.1
|
||||||
|
//
|
||||||
|
|
||||||
|
syntax = "proto2";
|
||||||
|
|
||||||
|
import "telemetry_top.proto";
|
||||||
|
|
||||||
|
//
|
||||||
|
// This occupies branch 3 from JuniperNetworksSensors
|
||||||
|
//
|
||||||
|
extend JuniperNetworksSensors {
|
||||||
|
optional Port jnpr_interface_ext = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Top-level message
|
||||||
|
//
|
||||||
|
message Port {
|
||||||
|
repeated InterfaceInfos interface_stats = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Interface information
|
||||||
|
//
|
||||||
|
message InterfaceInfos {
|
||||||
|
// Interface name, e.g., xe-0/0/0
|
||||||
|
required string if_name = 1 [(telemetry_options).is_key = true];
|
||||||
|
|
||||||
|
// Time when interface is created
|
||||||
|
optional uint64 init_time = 2;
|
||||||
|
|
||||||
|
// Global Index
|
||||||
|
optional uint32 snmp_if_index = 3;
|
||||||
|
|
||||||
|
// Name of parent for AE interface, if applicable
|
||||||
|
optional string parent_ae_name = 4;
|
||||||
|
|
||||||
|
// Egress queue information
|
||||||
|
repeated QueueStats egress_queue_info = 5;
|
||||||
|
|
||||||
|
// Ingress queue information
|
||||||
|
repeated QueueStats ingress_queue_info = 6;
|
||||||
|
|
||||||
|
// Inbound traffic statistics
|
||||||
|
optional InterfaceStats ingress_stats = 7;
|
||||||
|
|
||||||
|
// Outbound traffic statistics
|
||||||
|
optional InterfaceStats egress_stats = 8;
|
||||||
|
|
||||||
|
// Inbound traffic errors
|
||||||
|
optional IngressInterfaceErrors ingress_errors = 9;
|
||||||
|
|
||||||
|
// Interface administration status
|
||||||
|
optional string if_administration_status = 10;
|
||||||
|
|
||||||
|
// Interface operational status
|
||||||
|
optional string if_operational_status = 11;
|
||||||
|
|
||||||
|
// Interface description
|
||||||
|
optional string if_description = 12;
|
||||||
|
|
||||||
|
// Counter: number of carrier transitions on this interface
|
||||||
|
optional uint64 if_transitions = 13 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// This corresponds to the ifLastChange object in the standard interface MIB
|
||||||
|
optional uint32 ifLastChange = 14;
|
||||||
|
|
||||||
|
// This corresponds to the ifHighSpeed object in the standard interface MIB
|
||||||
|
optional uint32 ifHighSpeed = 15;
|
||||||
|
|
||||||
|
// Outbound traffic errors
|
||||||
|
optional EgressInterfaceErrors egress_errors = 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Interface queue statistics
|
||||||
|
//
|
||||||
|
message QueueStats {
|
||||||
|
// Queue number
|
||||||
|
optional uint32 queue_number = 1 [(telemetry_options).is_key = true];
|
||||||
|
|
||||||
|
// The total number of packets that have been added to this queue
|
||||||
|
optional uint64 packets = 2 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The total number of bytes that have been added to this queue
|
||||||
|
optional uint64 bytes = 3 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The total number of tail dropped packets
|
||||||
|
optional uint64 tail_drop_packets = 4 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The total number of rate-limited packets
|
||||||
|
optional uint64 rl_drop_packets = 5 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The total number of rate-limited bytes
|
||||||
|
optional uint64 rl_drop_bytes = 6 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The total number of red-dropped packets
|
||||||
|
optional uint64 red_drop_packets = 7 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The total number of red-dropped bytes
|
||||||
|
optional uint64 red_drop_bytes = 8 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// Average queue depth, in packets
|
||||||
|
optional uint64 avg_buffer_occupancy = 9 [(telemetry_options).is_gauge = true];
|
||||||
|
|
||||||
|
// Current queue depth, in packets
|
||||||
|
optional uint64 cur_buffer_occupancy = 10 [(telemetry_options).is_gauge = true];
|
||||||
|
|
||||||
|
// The max measured queue depth, in packets, across all measurements since boot
|
||||||
|
optional uint64 peak_buffer_occupancy = 11 [(telemetry_options).is_gauge = true];
|
||||||
|
|
||||||
|
// Allocated buffer size
|
||||||
|
optional uint64 allocated_buffer_size = 12 [(telemetry_options).is_gauge = true];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Interface statistics
|
||||||
|
//
|
||||||
|
message InterfaceStats {
|
||||||
|
// The total number of packets sent/received by this interface
|
||||||
|
optional uint64 if_pkts = 1 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The total number of bytes sent/received by this interface
|
||||||
|
optional uint64 if_octets = 2 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The rate at which packets are sent/received by this interface (in packets/sec)
|
||||||
|
optional uint64 if_1sec_pkts = 3 [(telemetry_options).is_gauge = true];
|
||||||
|
|
||||||
|
// The rate at which bytes are sent/received by this interface
|
||||||
|
optional uint64 if_1sec_octets = 4 [(telemetry_options).is_gauge = true];
|
||||||
|
|
||||||
|
// Total number of unicast packets sent/received by this interface
|
||||||
|
optional uint64 if_uc_pkts = 5 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// Total number of multicast packets sent/received by this interface
|
||||||
|
optional uint64 if_mc_pkts = 6 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// Total number of broadcast packets sent/received by this interface
|
||||||
|
optional uint64 if_bc_pkts = 7 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// Counter: total no of error packets sent/rcvd by this interface
|
||||||
|
optional uint64 if_error = 8 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// Counter: total no of PAUSE packets sent/rcvd by this interface
|
||||||
|
optional uint64 if_pause_pkts = 9 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// Counter: total no of UNKNOWN proto packets sent/rcvd by this interface
|
||||||
|
optional uint64 if_unknown_proto_pkts = 10 [(telemetry_options).is_counter = true];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Inbound traffic error statistics
|
||||||
|
//
|
||||||
|
message IngressInterfaceErrors {
|
||||||
|
// The number of packets that contained errors
|
||||||
|
optional uint64 if_errors = 1 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The number of packets dropped by the input queue of the I/O Manager ASIC
|
||||||
|
optional uint64 if_in_qdrops = 2 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The number of packets which were misaligned
|
||||||
|
optional uint64 if_in_frame_errors = 3 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The number of non-error packets which were chosen to be discarded
|
||||||
|
optional uint64 if_discards = 4 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The number of runt packets
|
||||||
|
optional uint64 if_in_runts = 5 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The number of packets that fail Layer 3 sanity checks of the header
|
||||||
|
optional uint64 if_in_l3_incompletes = 6 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The number of packets for which the software could not find a valid logical interface
|
||||||
|
optional uint64 if_in_l2chan_errors = 7 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The number of malform or short packets
|
||||||
|
optional uint64 if_in_l2_mismatch_timeouts = 8 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The number of FIFO errors
|
||||||
|
optional uint64 if_in_fifo_errors = 9 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The number of resource errors
|
||||||
|
optional uint64 if_in_resource_errors = 10 [(telemetry_options).is_counter = true];
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Outbound traffic error statistics
|
||||||
|
//
|
||||||
|
message EgressInterfaceErrors {
|
||||||
|
// The number of packets that contained errors
|
||||||
|
optional uint64 if_errors = 1 [(telemetry_options).is_counter = true];
|
||||||
|
|
||||||
|
// The number of non-error packets which were chosen to be discarded
|
||||||
|
optional uint64 if_discards = 2 [(telemetry_options).is_counter = true];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
[[inputs.file]]
|
||||||
|
files = ["./testcases/protobuf_issue_15571/message.bin"]
|
||||||
|
data_format = "xpath_protobuf"
|
||||||
|
|
||||||
|
xpath_print_document = true
|
||||||
|
xpath_native_types = true
|
||||||
|
xpath_protobuf_files = ["telemetry_top.proto", "port.proto"]
|
||||||
|
xpath_protobuf_type = "TelemetryStream"
|
||||||
|
xpath_protobuf_import_paths = [".", "./testcases/protobuf_issue_15571"]
|
||||||
|
|
||||||
|
[[inputs.file.xpath]]
|
||||||
|
metric_name = "'test'"
|
||||||
|
field_selection = "* | //if_name"
|
||||||
|
field_name_expansion = true
|
||||||
|
timestamp = "//timestamp"
|
||||||
|
timestamp_format = "unix_ms"
|
||||||
|
|
@ -0,0 +1,99 @@
|
||||||
|
//
|
||||||
|
// Copyrights (c) 2015, 2016, Juniper Networks, Inc.
|
||||||
|
// All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
// or more contributor license agreements. See the NOTICE file
|
||||||
|
// distributed with this work for additional information
|
||||||
|
// regarding copyright ownership. The ASF licenses this file
|
||||||
|
// to you under the Apache License, Version 2.0 (the
|
||||||
|
// "License"); you may not use this file except in compliance
|
||||||
|
// with the License. You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing,
|
||||||
|
// software distributed under the License is distributed on an
|
||||||
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
// KIND, either express or implied. See the License for the
|
||||||
|
// specific language governing permissions and limitations
|
||||||
|
// under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
//
|
||||||
|
// This file defines the top level message used for all Juniper
|
||||||
|
// Telemetry packets encoded to the protocol buffer format.
|
||||||
|
// The top level message is TelemetryStream.
|
||||||
|
//
|
||||||
|
|
||||||
|
syntax = "proto2";
|
||||||
|
|
||||||
|
import "google/protobuf/descriptor.proto";
|
||||||
|
|
||||||
|
extend google.protobuf.FieldOptions {
|
||||||
|
optional TelemetryFieldOptions telemetry_options = 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
message TelemetryFieldOptions {
|
||||||
|
optional bool is_key = 1;
|
||||||
|
optional bool is_timestamp = 2;
|
||||||
|
optional bool is_counter = 3;
|
||||||
|
optional bool is_gauge = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message TelemetryStream {
|
||||||
|
// router hostname
|
||||||
|
// (or, just in the case of legacy (microkernel) PFEs, the IP address)
|
||||||
|
required string system_id = 1 [(telemetry_options).is_key = true];
|
||||||
|
|
||||||
|
// line card / RE (slot number). For RE, it will be 65535
|
||||||
|
optional uint32 component_id = 2 [(telemetry_options).is_key = true];
|
||||||
|
|
||||||
|
// PFE (if applicable)
|
||||||
|
optional uint32 sub_component_id = 3 [(telemetry_options).is_key = true];
|
||||||
|
|
||||||
|
// Overload sensor name with "senor name, internal path, external path
|
||||||
|
// and component" seperated by ":". For RE sensors, component will be
|
||||||
|
// daemon-name and for PFE sensors it will be "PFE".
|
||||||
|
optional string sensor_name = 4 [(telemetry_options).is_key = true];
|
||||||
|
|
||||||
|
// sequence number, monotonically increasing for each
|
||||||
|
// system_id, component_id, sub_component_id + sensor_name.
|
||||||
|
optional uint32 sequence_number = 5;
|
||||||
|
|
||||||
|
// timestamp (milliseconds since 00:00:00 UTC 1/1/1970)
|
||||||
|
optional uint64 timestamp = 6 [(telemetry_options).is_timestamp = true];
|
||||||
|
|
||||||
|
// major version
|
||||||
|
optional uint32 version_major = 7;
|
||||||
|
|
||||||
|
// minor version
|
||||||
|
optional uint32 version_minor = 8;
|
||||||
|
|
||||||
|
// end-of-message marker, set to true when the end of wrap is reached
|
||||||
|
optional bool eom = 9;
|
||||||
|
|
||||||
|
optional IETFSensors ietf = 100;
|
||||||
|
|
||||||
|
optional EnterpriseSensors enterprise = 101;
|
||||||
|
}
|
||||||
|
|
||||||
|
message IETFSensors {
|
||||||
|
extensions 1 to max;
|
||||||
|
}
|
||||||
|
|
||||||
|
message EnterpriseSensors {
|
||||||
|
extensions 1 to max;
|
||||||
|
}
|
||||||
|
|
||||||
|
extend EnterpriseSensors {
|
||||||
|
// re-use IANA assigned numbers
|
||||||
|
optional JuniperNetworksSensors juniperNetworks = 2636;
|
||||||
|
}
|
||||||
|
|
||||||
|
message JuniperNetworksSensors {
|
||||||
|
extensions 1 to max;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
data_format = "xpath_protobuf"
|
data_format = "xpath_protobuf"
|
||||||
xpath_native_types = true
|
xpath_native_types = true
|
||||||
|
|
||||||
xpath_protobuf_file = "message.proto"
|
xpath_protobuf_files = ["message.proto"]
|
||||||
xpath_protobuf_type = "native_type.Message"
|
xpath_protobuf_type = "native_type.Message"
|
||||||
xpath_protobuf_import_paths = [".", "./testcases/protobuf_skip_bytes_grpc"]
|
xpath_protobuf_import_paths = [".", "./testcases/protobuf_skip_bytes_grpc"]
|
||||||
#xpath_protobuf_skip_bytes = 5
|
#xpath_protobuf_skip_bytes = 5
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
data_format = "xpath_protobuf"
|
data_format = "xpath_protobuf"
|
||||||
|
|
||||||
xpath_native_types = true
|
xpath_native_types = true
|
||||||
xpath_protobuf_file = "powerdns_message.proto"
|
xpath_protobuf_files = ["powerdns_message.proto"]
|
||||||
xpath_protobuf_type = "PBDNSMessage"
|
xpath_protobuf_type = "PBDNSMessage"
|
||||||
xpath_protobuf_import_paths = [".", "./testcases/protobuf_powerdns_hex"]
|
xpath_protobuf_import_paths = [".", "./testcases/protobuf_powerdns_hex"]
|
||||||
xpath_protobuf_skip_bytes = 2
|
xpath_protobuf_skip_bytes = 2
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
data_format = "xpath_protobuf"
|
data_format = "xpath_protobuf"
|
||||||
xpath_native_types = true
|
xpath_native_types = true
|
||||||
|
|
||||||
xpath_protobuf_file = "message.proto"
|
xpath_protobuf_files = ["message.proto"]
|
||||||
xpath_protobuf_type = "native_type.Message"
|
xpath_protobuf_type = "native_type.Message"
|
||||||
xpath_protobuf_import_paths = [".", "./testcases/protobuf_skip_bytes_grpc"]
|
xpath_protobuf_import_paths = [".", "./testcases/protobuf_skip_bytes_grpc"]
|
||||||
xpath_protobuf_skip_bytes = 5
|
xpath_protobuf_skip_bytes = 5
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue