mirror of
https://github.com/grafana/grafana.git
synced 2025-01-10 08:03:58 -06:00
63383ef545
* Build out barebones Traces editor - Add Traces query type and operation ID prop to query type - Add necessary header types - Update resource picker to appropriately work with traces query type - Build out TracesQueryEditor component - Include logic to retrieve operationId's for AI Workspaces - Add backend route mapping - Update macro to use timestamp as default time field for traces * AzureMonitor: Traces - Response parsing (#65442) * Update FormatAsField component - Add trace ResultFormat type - Generalise FormatAsField component - Add component to TracesQueryEditor - Remove duplicate code in setQueryValue * Add custom filter function to improve performance * Add basic conversion for logs to trace - Add serviceTags converter - Pass through required parameters (queryType and resultFormat) - Appropriately set visualisation * Update parsing to also fill trace tags - Add constant values for each table schema (include legacy mapping for now if needed) - Add constant for list of table tags - Set the foundation for dynamic query building - Update query to build tags value - Appropriately set operationName - Update tagsConverter to filter empty values * Fix lint and test issues * AzureMonitor: Traces - Data links (#65566) * Add portal link for traces - Pull out necessary values (itemId and itemType) - Appropriately construct - Fix ordering * Set default format as value - Also set default visualisation * Fix event schema * Set default formatAsField value * Include logs link on traces results - Adapt config links to allow custom title to be set * Correctly set operationId for query * Update backend types - Include OperationID in query - Pass forward datasource name and UID * Ensure setTime doesn't consistently get called if operationID is defined * Add explore link - Update util functions to allow setting custom datalinks * Fix tests * AzureMonitor: Traces - Query and Editor updates (#66076) * Add initial query - Will query the resource as soon as a resource has been selected - Updates the data links for the query without operationId - Remove initial operationId query and timeRange dependency - Update query building * Add entirely separate traces query property - Update shared types (also including future types for Azure traces) - Update backend log analytics datasource to accept both azureLogAnalytics and azureTraces queries - Update backend specific types - Update frontend datasource for new properties - Update mock query * Update FormatAsField to be entirely generic * Update query building to be done in backend - Add required mappings in backend - Update frontend querying * Fix query and explore data link * Add trace type selection * Better method for setting explore link * Fix operationId updating * Run go mod tidy * Unnecessary changes * Fix tests * AzureMonitor: Traces - Add correlation API support (#65855) Add correlation API support - Add necessary types - Add correlation API request when conditions are met - Update query * Fix property from merge * AzureMonitor: Traces - Filtering (#66303) * Add initial query - Will query the resource as soon as a resource has been selected - Updates the data links for the query without operationId - Remove initial operationId query and timeRange dependency - Update query building * Add entirely separate traces query property - Update shared types (also including future types for Azure traces) - Update backend log analytics datasource to accept both azureLogAnalytics and azureTraces queries - Update backend specific types - Update frontend datasource for new properties - Update mock query * Update FormatAsField to be entirely generic * Update query building to be done in backend - Add required mappings in backend - Update frontend querying * Fix query and explore data link * Add trace type selection * Better method for setting explore link * Fix operationId updating * Run go mod tidy * Unnecessary changes * Fix tests * Start building out Filters component - Configure component to query for Filter property values when a filter property is set - Add setFilters function - Add typing to tablesSchema - Use component in TracesQueryEditor * Update Filters - Asynchronously pull property options - Setup list of Filter components * Update filters component - Remove unused imports - Have local filters state and query filters - Correctly set filters values - Don't update query every time a filter property changes (not performant) * Update properties query - Use current timeRange - Get count to provide informative labels * Reset map when time changes * Add operation selection * Reset filters when property changes * Appropriate label name for empty values * Add filtering to query * Update filter components - Fix rendering issue - Correctly compare and update timeRange - Split out files for simplicity * Add checkbox option to multiselect - Add custom option component - Correctly call onChange - Add variableOptionGroup for template variable selection * Fix adding template vars * Improve labels and refresh labels on query prop changes * AzureMonitor: Traces - Testing (#66474) * Select ds for template variable interpolation * Update az logs ds tests - Add templateVariables test - Add filter test - Update mock - Remove anys * Update QueryEditor test - Update mocks with timeSrv for log analytics datasource - Fix query mock - Use appropriate and consistent selectors * Add TracesQueryEditor test - Update resourcePickerRows mock to include app insights resources - Remove comments and extra new line * Add FormatAsField test - Remove unneeded condition * Update resourcePicker utils test * Don't hide selected options in filters * Fix multi-selection on filters * Add TraceTypeField test - Add test file - Update selectors (remove copy/paste mistake) - Update placeholder text for select and add label * Add basic filters test * Begin filters test * Update filters test * Add final tests and simplify/generalise addFilter helper * Minor update to datasource test * Update macros test * Update selectors in tests * Add response-table-frame tests * Add datasource tests - Use sorting where JSON models are inconsistent - Update filters clause - Dedupe tags - Correct operationId conditions * Don't set a default value for blurInputOnSelect * Simplify datasource test * Update to use CheckGoldenJSON utils - Update with generated frame files - Remove redundant expected frame code - Update all usages * Fix lint * AzureMonitor: Traces feedback (#67292) * Filter traces if the visualisation is set to trace - Update build query logic - Added additional test cases - Return an error if the traces type is set by itself with the trace visualisation - Add descriptions to event types - Update tests * Fix bug for error displaying traces * Update mappings and add error field - Update tests - Remove unnecessary comments * Switch location of Operation ID field * Re-order fields * Update link title * Update label for event type selection * Update correct link title * Update logs datalink to link to Azure Logs in explore * Fix lint
149 lines
5.2 KiB
Go
149 lines
5.2 KiB
Go
package macros
|
|
|
|
import (
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/google/go-cmp/cmp"
|
|
"github.com/google/go-cmp/cmp/cmpopts"
|
|
"github.com/grafana/grafana-plugin-sdk-go/backend"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/grafana/grafana/pkg/infra/log"
|
|
"github.com/grafana/grafana/pkg/tsdb/azuremonitor/types"
|
|
)
|
|
|
|
func TestAzureLogAnalyticsMacros(t *testing.T) {
|
|
fromStart := time.Date(2018, 3, 15, 13, 0, 0, 0, time.UTC).In(time.Local)
|
|
timeRange := backend.TimeRange{
|
|
From: fromStart,
|
|
To: fromStart.Add(34 * time.Minute),
|
|
}
|
|
|
|
tests := []struct {
|
|
name string
|
|
query backend.DataQuery
|
|
kql string
|
|
expected string
|
|
Err require.ErrorAssertionFunc
|
|
}{
|
|
{
|
|
name: "invalid macro should be ignored",
|
|
query: backend.DataQuery{},
|
|
kql: "$__invalid()",
|
|
expected: "$__invalid()",
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "Kusto variables should be ignored",
|
|
query: backend.DataQuery{},
|
|
kql: ") on $left.b == $right.y",
|
|
expected: ") on $left.b == $right.y",
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "$__contains macro with a multi template variable that has multiple selected values as a parameter should build in clause",
|
|
query: backend.DataQuery{},
|
|
kql: "$__contains(col, 'val1','val2')",
|
|
expected: "['col'] in ('val1','val2')",
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "$__contains macro with a multi template variable that has a single selected value as a parameter should build in clause",
|
|
query: backend.DataQuery{},
|
|
kql: "$__contains(col, 'val1' )",
|
|
expected: "['col'] in ('val1')",
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "$__contains macro with multi template variable has custom All value as a parameter should return a true expression",
|
|
query: backend.DataQuery{},
|
|
kql: "$__contains(col, all)",
|
|
expected: "1 == 1",
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "$__timeFilter has no column parameter should use default time field",
|
|
query: backend.DataQuery{TimeRange: timeRange},
|
|
kql: "$__timeFilter()",
|
|
expected: "['TimeGenerated'] >= datetime('2018-03-15T13:00:00Z') and ['TimeGenerated'] <= datetime('2018-03-15T13:34:00Z')",
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "$__timeFilter has time field parameter",
|
|
query: backend.DataQuery{TimeRange: timeRange},
|
|
kql: "$__timeFilter(myTimeField)",
|
|
expected: "['myTimeField'] >= datetime('2018-03-15T13:00:00Z') and ['myTimeField'] <= datetime('2018-03-15T13:34:00Z')",
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "$__timeFrom and $__timeTo is in the query and range is a specific interval",
|
|
query: backend.DataQuery{TimeRange: timeRange},
|
|
kql: "myTimeField >= $__timeFrom() and myTimeField <= $__timeTo()",
|
|
expected: "myTimeField >= datetime('2018-03-15T13:00:00Z') and myTimeField <= datetime('2018-03-15T13:34:00Z')",
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "$__interval should use the defined interval from the query",
|
|
query: backend.DataQuery{
|
|
JSON: []byte(`{
|
|
"interval": "5m"
|
|
}`),
|
|
TimeRange: timeRange,
|
|
},
|
|
kql: "bin(TimeGenerated, $__interval)",
|
|
expected: "bin(TimeGenerated, 300000ms)",
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "$__interval should use the default interval if none is specified",
|
|
query: backend.DataQuery{TimeRange: timeRange},
|
|
kql: "bin(TimeGenerated, $__interval)",
|
|
expected: "bin(TimeGenerated, 34000ms)",
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "$__escapeMulti with multi template variable should replace values with KQL style escaped strings",
|
|
query: backend.DataQuery{},
|
|
kql: `CounterPath in ($__escapeMulti('\\grafana-vm\Network(eth0)\Total','\\grafana-vm\Network(eth1)\Total'))`,
|
|
expected: `CounterPath in (@'\\grafana-vm\Network(eth0)\Total', @'\\grafana-vm\Network(eth1)\Total')`,
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "$__escapeMulti with multi template variable and has one selected value that contains comma",
|
|
query: backend.DataQuery{},
|
|
kql: `$__escapeMulti('\\grafana-vm,\Network(eth0)\Total Bytes Received')`,
|
|
expected: `@'\\grafana-vm,\Network(eth0)\Total Bytes Received'`,
|
|
Err: require.NoError,
|
|
},
|
|
{
|
|
name: "$__escapeMulti with multi template variable and is not wrapped in single quotes should fail",
|
|
query: backend.DataQuery{},
|
|
kql: `$__escapeMulti(\\grafana-vm,\Network(eth0)\Total Bytes Received)`,
|
|
expected: "",
|
|
Err: require.Error,
|
|
},
|
|
{
|
|
name: "traces time field should remain as timestamp",
|
|
query: backend.DataQuery{
|
|
QueryType: "Azure Traces",
|
|
TimeRange: timeRange,
|
|
},
|
|
kql: `$__timeFilter()`,
|
|
expected: "['timestamp'] >= datetime('2018-03-15T13:00:00Z') and ['timestamp'] <= datetime('2018-03-15T13:34:00Z')",
|
|
Err: require.NoError,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
defaultTimeField := "TimeGenerated"
|
|
rawQuery, err := KqlInterpolate(log.New("test"), tt.query, types.DatasourceInfo{}, tt.kql, defaultTimeField)
|
|
tt.Err(t, err)
|
|
if diff := cmp.Diff(tt.expected, rawQuery, cmpopts.EquateNaNs()); diff != "" {
|
|
t.Errorf("Result mismatch (-want +got):\n%s", diff)
|
|
}
|
|
})
|
|
}
|
|
}
|