CloudWatch: Add tracking for logs anomalies (#113181)

- Fix tracking for new logs queries with logGroups field
This commit is contained in:
Ida Štambuk
2025-10-30 12:10:00 +00:00
committed by GitHub
parent 5f2074e84c
commit 80d5cfa184
3 changed files with 51 additions and 11 deletions
@@ -2,7 +2,7 @@ import { DashboardLoadedEvent } from '@grafana/data';
import { CloudWatchQuery } from '../types';
const baseLogsQuery = {
const baseLegacyLogsQuery = {
datasource: {
type: 'cloudwatch',
uid: 'P7DC3E4760CFAC4AP',
@@ -17,6 +17,15 @@ const baseLogsQuery = {
statsGroups: [],
};
const baseLogsQuery = {
...baseLegacyLogsQuery,
logGroups: [
{ arn: 'arn:test', name: 'log-group-1' },
{ arn: 'arn:test2', name: 'log-group-2' },
],
logGroupNames: undefined,
};
export const CloudWatchDashboardLoadedEvent = new DashboardLoadedEvent({
dashboardId: 'dashboard123',
orgId: 1,
@@ -474,6 +483,9 @@ export const CloudWatchDashboardLoadedEvent = new DashboardLoadedEvent({
sqlExpression: '',
statistic: 'Average',
},
{
...baseLegacyLogsQuery,
},
{
...baseLogsQuery,
},
@@ -779,6 +791,22 @@ export const CloudWatchDashboardLoadedEvent = new DashboardLoadedEvent({
sqlExpression: '',
statistic: '',
},
{
refId: 'A',
region: 'default',
queryMode: 'Logs',
logsMode: 'Anomalies',
anomalyDetectionARN: '',
suppressionState: 'suppressed',
},
{
refId: 'A',
region: 'default',
queryMode: 'Logs',
logsMode: 'Anomalies',
anomalyDetectionARN: '',
suppressionState: 'all',
},
] as CloudWatchQuery[],
},
});
@@ -27,10 +27,11 @@ describe('onDashboardLoadedHandler', () => {
dashboard_id: 'dashboard123',
grafana_version: 'v9.0.0',
org_id: 1,
logs_queries_count: 5,
logs_cwli_queries_count: 2,
logs_queries_count: 8,
logs_cwli_queries_count: 3,
logs_sql_queries_count: 1,
logs_ppl_queries_count: 2,
log_anomalies_queries_count: 2,
metrics_queries_count: 21,
metrics_query_builder_count: 3,
metrics_query_code_count: 4,
@@ -1,13 +1,15 @@
import { DashboardLoadedEvent } from '@grafana/data';
import { config, reportInteraction } from '@grafana/runtime';
import { isCloudWatchLogsQuery, isCloudWatchMetricsQuery } from './guards';
import { isCloudWatchLogsQuery, isCloudWatchMetricsQuery, isLogsAnomaliesQuery } from './guards';
import { migrateMetricQuery } from './migrations/metricQueryMigrations';
import pluginJson from './plugin.json';
import {
CloudWatchLogsAnomaliesQuery,
CloudWatchLogsQuery,
CloudWatchMetricsQuery,
CloudWatchQuery,
LogsMode,
LogsQueryLanguage,
MetricEditorMode,
MetricQueryType,
@@ -31,6 +33,9 @@ type CloudWatchOnDashboardLoadedTrackingEvent = {
/* The number of Logs queries that use PPL language */
logs_ppl_queries_count: number;
/* The number of log anomalies queries */
log_anomalies_queries_count: number;
/* The number of CloudWatch metrics queries present in the dashboard*/
metrics_queries_count: number;
@@ -77,7 +82,8 @@ export const onDashboardLoadedHandler = ({
return;
}
let logsQueries: CloudWatchLogsQuery[] = [];
let logsInsightsQueries: CloudWatchLogsQuery[] = [];
let logAnomaliesQueries: CloudWatchLogsAnomaliesQuery[] = [];
let metricsQueries: CloudWatchMetricsQuery[] = [];
for (const query of cloudWatchQueries) {
@@ -85,8 +91,12 @@ export const onDashboardLoadedHandler = ({
continue;
}
if (isCloudWatchLogsQuery(query)) {
query.logGroupNames?.length && logsQueries.push(query);
const isLogsInsightsQuery =
isCloudWatchLogsQuery(query) && (!query.logsMode || query.logsMode === LogsMode.Insights);
if (isLogsInsightsQuery) {
(query.logGroupNames?.length || query.logGroups?.length) && logsInsightsQueries.push(query);
} else if (isLogsAnomaliesQuery(query)) {
logAnomaliesQueries.push(query);
} else if (isCloudWatchMetricsQuery(query)) {
const migratedQuery = migrateMetricQuery(query);
filterMetricsQuery(migratedQuery) && metricsQueries.push(query);
@@ -97,12 +107,13 @@ export const onDashboardLoadedHandler = ({
grafana_version: grafanaVersion,
dashboard_id: dashboardId,
org_id: orgId,
logs_queries_count: logsQueries?.length,
logs_cwli_queries_count: logsQueries?.filter(
logs_queries_count: logsInsightsQueries?.length + logAnomaliesQueries.length,
logs_cwli_queries_count: logsInsightsQueries?.filter(
(q) => !q.queryLanguage || q.queryLanguage === LogsQueryLanguage.CWLI
).length,
logs_sql_queries_count: logsQueries?.filter((q) => q.queryLanguage === LogsQueryLanguage.SQL).length,
logs_ppl_queries_count: logsQueries?.filter((q) => q.queryLanguage === LogsQueryLanguage.PPL).length,
logs_sql_queries_count: logsInsightsQueries?.filter((q) => q.queryLanguage === LogsQueryLanguage.SQL).length,
logs_ppl_queries_count: logsInsightsQueries?.filter((q) => q.queryLanguage === LogsQueryLanguage.PPL).length,
log_anomalies_queries_count: logAnomaliesQueries.length,
metrics_queries_count: metricsQueries?.length,
metrics_search_count: 0,
metrics_search_builder_count: 0,