Azure: Improve Azure Prometheus exemplars UI/UX (#97198)

* Add better error messaging

- Ensure it's clear to users what action needs to be taken if an operation ID cannot be found
- Add test

* Display resource picker for trace exemplar queries

* Remove unneeded test

* Update tests
This commit is contained in:
Andreas Christou
2025-01-09 11:33:47 +00:00
committed by GitHub
parent 42f6f917c9
commit 2860eb52d0
7 changed files with 126 additions and 109 deletions
@@ -625,6 +625,9 @@ func getCorrelationWorkspaces(ctx context.Context, baseResource string, resource
}()
if res.StatusCode/100 != 2 {
if res.StatusCode == 404 {
return AzureCorrelationAPIResponse{}, backend.DownstreamError(fmt.Errorf("requested trace not found by Application Insights indexing. Select the relevant Application Insights resource to search for the Operation ID directly"))
}
return AzureCorrelationAPIResponse{}, utils.CreateResponseErrorFromStatusCode(res.StatusCode, res.Status, body)
}
var data AzureCorrelationAPIResponse
@@ -26,6 +26,10 @@ func TestBuildAppInsightsQuery(t *testing.T) {
ctx := context.Background()
svr := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
if strings.Contains(r.URL.Path, "missing-op-id") {
w.WriteHeader(http.StatusNotFound)
return
}
w.WriteHeader(http.StatusOK)
var correlationRes AzureCorrelationAPIResponse
if strings.Contains(r.URL.Path, "test-op-id") {
@@ -95,7 +99,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
tests := []struct {
name string
queryModel backend.DataQuery
azureLogAnalyticsQuery AzureLogAnalyticsQuery
azureLogAnalyticsQuery *AzureLogAnalyticsQuery
Err require.ErrorAssertionFunc
}{
{
@@ -114,7 +118,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTable,
URL: "v1/apps/r1/query",
@@ -190,7 +194,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTable,
URL: "v1/apps/r1/query",
@@ -264,7 +268,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTable,
URL: "v1/apps/r1/query",
@@ -337,7 +341,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTable,
URL: "v1/apps/r1/query",
@@ -413,7 +417,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTable,
URL: "v1/apps/r1/query",
@@ -493,7 +497,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTable,
URL: "v1/apps/r1/query",
@@ -573,7 +577,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTable,
URL: "v1/apps/r1/query",
@@ -651,7 +655,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTrace,
URL: "v1/apps/r1/query",
@@ -724,7 +728,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTrace,
URL: "v1/apps/r1/query",
@@ -800,7 +804,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTrace,
URL: "v1/apps/r1/query",
@@ -842,7 +846,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTrace,
URL: "v1/apps/r1/query",
@@ -920,7 +924,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTrace,
URL: "v1/apps/r1/query",
@@ -997,7 +1001,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTrace,
URL: "v1/apps/r1/query",
@@ -1076,7 +1080,7 @@ func TestBuildAppInsightsQuery(t *testing.T) {
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: AzureLogAnalyticsQuery{
azureLogAnalyticsQuery: &AzureLogAnalyticsQuery{
RefID: "A",
ResultFormat: dataquery.ResultFormatTrace,
URL: "v1/apps/r1/query",
@@ -1147,13 +1151,34 @@ func TestBuildAppInsightsQuery(t *testing.T) {
},
Err: require.NoError,
},
{
name: "trace query with missing operation ID",
queryModel: backend.DataQuery{
JSON: []byte(fmt.Sprintf(`{
"queryType": "Azure Traces",
"azureTraces": {
"resources": ["/subscriptions/test-sub/resourceGroups/test-rg/providers/Microsoft.Insights/components/r1"],
"resultFormat": "%s",
"traceTypes": ["trace"],
"operationId": "missing-op-id"
}
}`, dataquery.ResultFormatTable)),
RefID: "A",
TimeRange: timeRange,
QueryType: string(dataquery.AzureQueryTypeAzureTraces),
},
azureLogAnalyticsQuery: nil,
Err: func(tt require.TestingT, err error, i ...interface{}) {
require.ErrorContains(tt, err, "requested trace not found by Application Insights indexing. Select the relevant Application Insights resource to search for the Operation ID directly")
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
query, err := buildAppInsightsQuery(ctx, tt.queryModel, dsInfo, appInsightsRegExp, log.NewNullLogger())
tt.Err(t, err)
if diff := cmp.Diff(&tt.azureLogAnalyticsQuery, query); diff != "" {
if diff := cmp.Diff(tt.azureLogAnalyticsQuery, query); diff != "" {
t.Errorf("Result mismatch (-want +got): \n%s", diff)
}
})