Files
signoz/pkg/telemetrymetadata/metadata_query_test.go

87 lines
2.9 KiB
Go

package telemetrymetadata
import (
"context"
"testing"
"github.com/SigNoz/signoz/pkg/instrumentation/instrumentationtest"
"github.com/SigNoz/signoz/pkg/telemetrylogs"
"github.com/SigNoz/signoz/pkg/telemetrymeter"
"github.com/SigNoz/signoz/pkg/telemetrymetrics"
"github.com/SigNoz/signoz/pkg/telemetrystore"
"github.com/SigNoz/signoz/pkg/telemetrystore/telemetrystoretest"
"github.com/SigNoz/signoz/pkg/telemetrytraces"
"github.com/SigNoz/signoz/pkg/types/telemetrytypes"
cmock "github.com/srikanthccv/ClickHouse-go-mock"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestGetFirstSeenFromMetricMetadata(t *testing.T) {
mockTelemetryStore := telemetrystoretest.New(telemetrystore.Config{}, &regexMatcher{})
mock := mockTelemetryStore.Mock()
metadata := NewTelemetryMetaStore(
instrumentationtest.New().ToProviderSettings(),
mockTelemetryStore,
telemetrytraces.DBName,
telemetrytraces.TagAttributesV2TableName,
telemetrytraces.SpanAttributesKeysTblName,
telemetrytraces.SpanIndexV3TableName,
telemetrymetrics.DBName,
telemetrymetrics.AttributesMetadataTableName,
telemetrymeter.DBName,
telemetrymeter.SamplesAgg1dTableName,
telemetrylogs.DBName,
telemetrylogs.LogsV2TableName,
telemetrylogs.TagAttributesV2TableName,
telemetrylogs.LogAttributeKeysTblName,
telemetrylogs.LogResourceKeysTblName,
DBName,
AttributesMetadataLocalTableName,
)
lookupKeys := []telemetrytypes.MetricMetadataLookupKey{
{
MetricName: "metric1",
AttributeName: "attr1",
AttributeValue: "val1",
},
{
MetricName: "metric2",
AttributeName: "attr2",
AttributeValue: "val2",
},
}
// ClickHouse tuple syntax is (x, y, z)
// the structure should lead to:
// SELECT ... WHERE (metric_name, attr_name, attr_string_value) IN ((?, ?, ?), (?, ?, ?)) ...
expectedQuery := `SELECT metric_name, attr_name, attr_string_value, min\(first_reported_unix_milli\) AS first_seen FROM signoz_metrics.distributed_metadata WHERE \(metric_name, attr_name, attr_string_value\) IN \(\(\?, \?, \?\), \(\?, \?, \?\)\) GROUP BY metric_name, attr_name, attr_string_value ORDER BY first_seen`
// Note: regexMatcher uses regexp.MatchString, so we escape parens and ?
mock.ExpectQuery(expectedQuery).
WithArgs("metric1", "attr1", "val1", "metric2", "attr2", "val2").
WillReturnRows(cmock.NewRows([]cmock.ColumnType{
{Name: "metric_name", Type: "String"},
{Name: "attr_name", Type: "String"},
{Name: "attr_string_value", Type: "String"},
{Name: "first_seen", Type: "UInt64"},
}, [][]any{
{"metric1", "attr1", "val1", uint64(1000)},
{"metric2", "attr2", "val2", uint64(2000)},
}))
result, err := metadata.GetFirstSeenFromMetricMetadata(context.Background(), lookupKeys)
require.NoError(t, err)
assert.Equal(t, int64(1000), result[lookupKeys[0]])
assert.Equal(t, int64(2000), result[lookupKeys[1]])
if err := mock.ExpectationsWereMet(); err != nil {
t.Errorf("there were unfulfilled expectations: %s", err)
}
}