mirror of
https://git.mirrors.martin98.com/https://github.com/SigNoz/signoz
synced 2025-07-27 21:12:00 +08:00
91 lines
3.1 KiB
Go
91 lines
3.1 KiB
Go
package telemetrymetrics
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
schema "github.com/SigNoz/signoz-otel-collector/cmd/signozschemamigrator/schema_migrator"
|
|
qbtypes "github.com/SigNoz/signoz/pkg/types/querybuildertypes/querybuildertypesv5"
|
|
"github.com/SigNoz/signoz/pkg/types/telemetrytypes"
|
|
)
|
|
|
|
var (
|
|
timeSeriesV4Columns = map[string]*schema.Column{
|
|
"temporality": {Name: "temporality", Type: schema.LowCardinalityColumnType{ElementType: schema.ColumnTypeString}},
|
|
"metric_name": {Name: "metric_name", Type: schema.LowCardinalityColumnType{ElementType: schema.ColumnTypeString}},
|
|
"type": {Name: "type", Type: schema.LowCardinalityColumnType{ElementType: schema.ColumnTypeString}},
|
|
"is_monotonic": {Name: "is_monotonic", Type: schema.ColumnTypeBool},
|
|
"fingerprint": {Name: "fingerprint", Type: schema.ColumnTypeUInt64},
|
|
"unix_milli": {Name: "unix_milli", Type: schema.ColumnTypeInt64},
|
|
"labels": {Name: "labels", Type: schema.ColumnTypeString},
|
|
"attrs": {Name: "attrs", Type: schema.MapColumnType{
|
|
KeyType: schema.LowCardinalityColumnType{ElementType: schema.ColumnTypeString},
|
|
ValueType: schema.ColumnTypeString,
|
|
}},
|
|
"scope_attrs": {Name: "scope_attrs", Type: schema.MapColumnType{
|
|
KeyType: schema.LowCardinalityColumnType{ElementType: schema.ColumnTypeString},
|
|
ValueType: schema.ColumnTypeString,
|
|
}},
|
|
"resource_attrs": {Name: "resource_attrs", Type: schema.MapColumnType{
|
|
KeyType: schema.LowCardinalityColumnType{ElementType: schema.ColumnTypeString},
|
|
ValueType: schema.ColumnTypeString,
|
|
}},
|
|
}
|
|
)
|
|
|
|
type fieldMapper struct{}
|
|
|
|
func NewFieldMapper() qbtypes.FieldMapper {
|
|
return &fieldMapper{}
|
|
}
|
|
|
|
func (m *fieldMapper) getColumn(_ context.Context, key *telemetrytypes.TelemetryFieldKey) (*schema.Column, error) {
|
|
|
|
switch key.FieldContext {
|
|
case telemetrytypes.FieldContextResource, telemetrytypes.FieldContextScope, telemetrytypes.FieldContextAttribute:
|
|
return timeSeriesV4Columns["labels"], nil
|
|
case telemetrytypes.FieldContextMetric, telemetrytypes.FieldContextUnspecified:
|
|
col, ok := timeSeriesV4Columns[key.Name]
|
|
if !ok {
|
|
return nil, qbtypes.ErrColumnNotFound
|
|
}
|
|
return col, nil
|
|
}
|
|
|
|
return nil, qbtypes.ErrColumnNotFound
|
|
}
|
|
|
|
func (m *fieldMapper) FieldFor(ctx context.Context, key *telemetrytypes.TelemetryFieldKey) (string, error) {
|
|
column, err := m.getColumn(ctx, key)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
switch key.FieldContext {
|
|
case telemetrytypes.FieldContextResource, telemetrytypes.FieldContextScope, telemetrytypes.FieldContextAttribute:
|
|
return fmt.Sprintf("JSONExtractString(%s, '%s')", column.Name, key.Name), nil
|
|
case telemetrytypes.FieldContextMetric:
|
|
return column.Name, nil
|
|
}
|
|
|
|
return column.Name, nil
|
|
}
|
|
|
|
func (m *fieldMapper) ColumnFor(ctx context.Context, key *telemetrytypes.TelemetryFieldKey) (*schema.Column, error) {
|
|
return m.getColumn(ctx, key)
|
|
}
|
|
|
|
func (m *fieldMapper) ColumnExpressionFor(
|
|
ctx context.Context,
|
|
field *telemetrytypes.TelemetryFieldKey,
|
|
keys map[string][]*telemetrytypes.TelemetryFieldKey,
|
|
) (string, error) {
|
|
|
|
colName, err := m.FieldFor(ctx, field)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return fmt.Sprintf("%s AS `%s`", colName, field.Name), nil
|
|
}
|