feat(parsers.avro): Get metric name from the message field (#13914)
This commit is contained in:
parent
ac4cb12db8
commit
fbe2fb47eb
|
|
@ -10,6 +10,20 @@ The message is supposed to be encoded as follows:
|
||||||
| 1-4 | Schema ID | 4-byte schema ID as returned by Schema Registry. |
|
| 1-4 | Schema ID | 4-byte schema ID as returned by Schema Registry. |
|
||||||
| 5- | Data | Serialized data. |
|
| 5- | Data | Serialized data. |
|
||||||
|
|
||||||
|
The metric name will be set according the following priority:
|
||||||
|
|
||||||
|
1. Try to get metric name from the message field if it is set in the
|
||||||
|
`avro_measurement_field` option.
|
||||||
|
2. If the name is not determined, then try to get it from
|
||||||
|
`avro_measurement` option as the static value.
|
||||||
|
3. If the name is still not determined, then try to get it from the
|
||||||
|
schema definition in the following format `[schema_namespace.]schema_name`,
|
||||||
|
where schema namespace is optional and will be added only if it is specified
|
||||||
|
in the schema definition.
|
||||||
|
|
||||||
|
In case if the metric name could not be determined according to these steps
|
||||||
|
the error will be rised and the message will not be parsed.
|
||||||
|
|
||||||
## Configuration
|
## Configuration
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
|
|
@ -63,6 +77,11 @@ The message is supposed to be encoded as follows:
|
||||||
# }
|
# }
|
||||||
#'''
|
#'''
|
||||||
|
|
||||||
|
## Measurement field name; The meauserment name will be taken
|
||||||
|
## from this field. If not set, determine measurement name
|
||||||
|
## from the following 'avro_measurement' option
|
||||||
|
# avro_measurement_field = "field_name"
|
||||||
|
|
||||||
## Measurement string; if not set, determine measurement name from
|
## Measurement string; if not set, determine measurement name from
|
||||||
## schema (as "<namespace>.<name>")
|
## schema (as "<namespace>.<name>")
|
||||||
# avro_measurement = "ratings"
|
# avro_measurement = "ratings"
|
||||||
|
|
|
||||||
|
|
@ -24,18 +24,19 @@ import (
|
||||||
// an attached schema or schema fingerprint
|
// an attached schema or schema fingerprint
|
||||||
|
|
||||||
type Parser struct {
|
type Parser struct {
|
||||||
MetricName string `toml:"metric_name"`
|
MetricName string `toml:"metric_name"`
|
||||||
SchemaRegistry string `toml:"avro_schema_registry"`
|
SchemaRegistry string `toml:"avro_schema_registry"`
|
||||||
CaCertPath string `toml:"avro_schema_registry_cert"`
|
CaCertPath string `toml:"avro_schema_registry_cert"`
|
||||||
Schema string `toml:"avro_schema"`
|
Schema string `toml:"avro_schema"`
|
||||||
Format string `toml:"avro_format"`
|
Format string `toml:"avro_format"`
|
||||||
Measurement string `toml:"avro_measurement"`
|
Measurement string `toml:"avro_measurement"`
|
||||||
Tags []string `toml:"avro_tags"`
|
MeasurementField string `toml:"avro_measurement_field"`
|
||||||
Fields []string `toml:"avro_fields"`
|
Tags []string `toml:"avro_tags"`
|
||||||
Timestamp string `toml:"avro_timestamp"`
|
Fields []string `toml:"avro_fields"`
|
||||||
TimestampFormat string `toml:"avro_timestamp_format"`
|
Timestamp string `toml:"avro_timestamp"`
|
||||||
FieldSeparator string `toml:"avro_field_separator"`
|
TimestampFormat string `toml:"avro_timestamp_format"`
|
||||||
DefaultTags map[string]string `toml:"tags"`
|
FieldSeparator string `toml:"avro_field_separator"`
|
||||||
|
DefaultTags map[string]string `toml:"tags"`
|
||||||
|
|
||||||
Log telegraf.Logger `toml:"-"`
|
Log telegraf.Logger `toml:"-"`
|
||||||
registryObj *schemaRegistry
|
registryObj *schemaRegistry
|
||||||
|
|
@ -212,9 +213,26 @@ func (p *Parser) createMetric(data map[string]interface{}, schema string) (teleg
|
||||||
// A telegraf metric needs at least one field.
|
// A telegraf metric needs at least one field.
|
||||||
return nil, errors.New("number of fields is 0; unable to create metric")
|
return nil, errors.New("number of fields is 0; unable to create metric")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If measurement field name is specified in the configuration
|
||||||
|
// take value from that field and do not include it into fields or tags
|
||||||
|
name := ""
|
||||||
|
if p.MeasurementField != "" {
|
||||||
|
sField := p.MeasurementField
|
||||||
|
sMetric, err := internal.ToString(data[sField])
|
||||||
|
if err != nil {
|
||||||
|
p.Log.Warnf("Could not convert %v to string for metric name %q: %w", data[sField], sField, err)
|
||||||
|
} else {
|
||||||
|
name = sMetric
|
||||||
|
}
|
||||||
|
}
|
||||||
// Now some fancy stuff to extract the measurement.
|
// Now some fancy stuff to extract the measurement.
|
||||||
// If it's set in the configuration, use that.
|
// If it's set in the configuration, use that.
|
||||||
name := p.Measurement
|
if name == "" {
|
||||||
|
// If field name is not specified or field does not exist and
|
||||||
|
// metric name set in the configuration, use that.
|
||||||
|
name = p.Measurement
|
||||||
|
}
|
||||||
separator := "."
|
separator := "."
|
||||||
if name == "" {
|
if name == "" {
|
||||||
// Try using the namespace defined in the schema. In case there
|
// Try using the namespace defined in the schema. In case there
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
cpu_load,Server=test_server Value=18.7 1694526986671
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
ÞæîšÑbtest_server33333³2@cpu_load
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
[[ inputs.file ]]
|
||||||
|
files = ["./testdata/measurement_name_from_message/message.avro"]
|
||||||
|
data_format = "avro"
|
||||||
|
avro_measurement_field = "Measurement"
|
||||||
|
avro_tags = [ "Server" ]
|
||||||
|
avro_fields = [ "Value" ]
|
||||||
|
avro_schema = '''
|
||||||
|
{
|
||||||
|
"type": "record",
|
||||||
|
"name": "TestRecord",
|
||||||
|
"fields": [
|
||||||
|
{
|
||||||
|
"name": "ServerTs",
|
||||||
|
"type": "long"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Server",
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Value",
|
||||||
|
"type": "double"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Measurement",
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
'''
|
||||||
Loading…
Reference in New Issue