grafana/pkg/tsdb/azuremonitor/loganalytics/azure-response-table-frame_test.go
Andreas Christou c9778c3332
AzureMonitor: Prometheus exemplars support (#87742)
* Update types

* Mark datasource as supporting traces

* Add logic to transform exemplar query to traces query

* Render appropriate editor

* Run trace query for exemplars

* Refactor out common functions

- Add function to retrieve first/default subscription

* Add route for trace exemplars

* Update logic to appropriately query exemplars

* Update traces query builder

* Update instance test

* Remove unneeded import

* Set traces pseudo data source

* Replace deprecated function calls

* Add helper for setting default traces query

* Don't show resource field for exemplars query

* When resetting operation ID for exemplars set query to default

- Update tests

* Update query header to appropriately set the service value

* Fix response frame creation and update tests

* Correctly select resource

* Convert subscriptionsApiVersion to const

* Add feature toggle
2024-06-06 17:53:17 +01:00

143 lines
4.0 KiB
Go

package loganalytics
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"strings"
"testing"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/grafana/grafana/pkg/tsdb/azuremonitor/kinds/dataquery"
"github.com/grafana/grafana/pkg/tsdb/azuremonitor/testdata"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestLogTableToFrame(t *testing.T) {
tests := []struct {
name string
testFile string
expectedFrame func() *data.Frame
}{
{
name: "single series",
testFile: "loganalytics/1-log-analytics-response-metrics-single-series.json",
},
{
name: "response table",
testFile: "loganalytics/6-log-analytics-response-table.json",
},
{
name: "all supported field types",
testFile: "loganalytics/7-log-analytics-all-types-table.json",
},
{
name: "nan and infinity in real response",
testFile: "loganalytics/8-log-analytics-response-nan-inf.json",
},
{
name: "data and error in real response",
testFile: "loganalytics/9-log-analytics-response-error.json",
},
{
name: "data and warning in real response",
testFile: "loganalytics/10-log-analytics-response-warning.json",
},
{
name: "empty data response",
testFile: "loganalytics/11-log-analytics-response-empty.json",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
res := loadTestFileWithNumber(t, tt.testFile)
frame, err := ResponseTableToFrame(&res.Tables[0], "A", "query", dataquery.AzureQueryTypeAzureLogAnalytics, dataquery.ResultFormatTable)
appendErrorNotice(frame, res.Error)
require.NoError(t, err)
testdata.CheckGoldenFrame(t, "../testdata", tt.testFile, frame)
})
}
}
func TestTraceTableToFrame(t *testing.T) {
tests := []struct {
name string
testFile string
expectedFrame func() *data.Frame
resultFormat dataquery.ResultFormat
queryType dataquery.AzureQueryType
}{
{
name: "multi trace",
testFile: "traces/1-traces-multiple-table.json",
resultFormat: dataquery.ResultFormatTable,
queryType: dataquery.AzureQueryTypeAzureTraces,
},
{
name: "multi trace as trace format",
testFile: "traces/1-traces-multiple-table.json",
resultFormat: dataquery.ResultFormatTrace,
queryType: dataquery.AzureQueryTypeAzureTraces,
},
{
name: "single trace",
testFile: "traces/2-traces-single-table.json",
resultFormat: dataquery.ResultFormatTable,
queryType: dataquery.AzureQueryTypeAzureTraces,
},
{
name: "single trace as trace format",
testFile: "traces/2-traces-single-table.json",
resultFormat: dataquery.ResultFormatTrace,
queryType: dataquery.AzureQueryTypeAzureTraces,
},
{
name: "single trace with empty serviceTags and tags",
testFile: "traces/3-traces-empty-dynamics.json",
resultFormat: dataquery.ResultFormatTrace,
queryType: dataquery.AzureQueryTypeAzureTraces,
},
{
name: "single trace as trace format from exemplars query",
testFile: "traces/2-traces-single-table.json",
resultFormat: dataquery.ResultFormatTrace,
queryType: dataquery.AzureQueryTypeTraceql,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
res := loadTestFileWithNumber(t, tt.testFile)
frame, err := ResponseTableToFrame(&res.Tables[0], "A", "query", tt.queryType, tt.resultFormat)
appendErrorNotice(frame, res.Error)
require.NoError(t, err)
testdata.CheckGoldenFrame(t, "../testdata", fmt.Sprintf("%s.%s", tt.testFile, strings.ReplaceAll(tt.name, " ", "-")), frame)
})
}
}
func loadTestFileWithNumber(t *testing.T, name string) AzureLogAnalyticsResponse {
t.Helper()
path := filepath.Join("../testdata", name)
// Ignore gosec warning G304 since it's a test
// nolint:gosec
f, err := os.Open(path)
require.NoError(t, err)
defer func() {
err := f.Close()
assert.NoError(t, err)
}()
d := json.NewDecoder(f)
d.UseNumber()
var data AzureLogAnalyticsResponse
err = d.Decode(&data)
require.NoError(t, err)
return data
}