mirror of
				https://github.com/grafana/grafana.git
				synced 2025-02-25 18:55:37 -06:00 
			
		
		
		
	CloudMonitor: Add adoption metrics (#60706)
* Add adoption metrics for Cloud Monitoring - Add metrics to track each query type (MQL/Time Series Query, Builder/Time Series Filter, SLO, Annotation) * Remove hidden fields and account for pre 9.4 queries * Simplify object
This commit is contained in:
		@@ -1,14 +1,64 @@
 | 
			
		||||
import { DataSourcePlugin } from '@grafana/data';
 | 
			
		||||
import { get } from 'lodash';
 | 
			
		||||
 | 
			
		||||
import { DataSourcePlugin, DashboardLoadedEvent } from '@grafana/data';
 | 
			
		||||
import { getAppEvents } from '@grafana/runtime';
 | 
			
		||||
 | 
			
		||||
import CloudMonitoringCheatSheet from './components/CloudMonitoringCheatSheet';
 | 
			
		||||
import { ConfigEditor } from './components/ConfigEditor/ConfigEditor';
 | 
			
		||||
import { QueryEditor } from './components/QueryEditor';
 | 
			
		||||
import { CloudMonitoringVariableQueryEditor } from './components/VariableQueryEditor';
 | 
			
		||||
import CloudMonitoringDatasource from './datasource';
 | 
			
		||||
import { CloudMonitoringQuery } from './types';
 | 
			
		||||
import pluginJson from './plugin.json';
 | 
			
		||||
import { trackCloudMonitoringDashboardLoaded } from './tracking';
 | 
			
		||||
import { CloudMonitoringQuery, QueryType } from './types';
 | 
			
		||||
 | 
			
		||||
export const plugin = new DataSourcePlugin<CloudMonitoringDatasource, CloudMonitoringQuery>(CloudMonitoringDatasource)
 | 
			
		||||
  .setQueryEditorHelp(CloudMonitoringCheatSheet)
 | 
			
		||||
  .setQueryEditor(QueryEditor)
 | 
			
		||||
  .setConfigEditor(ConfigEditor)
 | 
			
		||||
  .setVariableQueryEditor(CloudMonitoringVariableQueryEditor);
 | 
			
		||||
 | 
			
		||||
// Track dashboard loads to RudderStack
 | 
			
		||||
getAppEvents().subscribe<DashboardLoadedEvent<CloudMonitoringQuery>>(
 | 
			
		||||
  DashboardLoadedEvent,
 | 
			
		||||
  ({ payload: { dashboardId, orgId, grafanaVersion, queries } }) => {
 | 
			
		||||
    const cloudmonitorQueries = queries[pluginJson.id];
 | 
			
		||||
    let stats = {
 | 
			
		||||
      [QueryType.TIME_SERIES_QUERY]: 0,
 | 
			
		||||
      [QueryType.TIME_SERIES_LIST]: 0,
 | 
			
		||||
      [QueryType.SLO]: 0,
 | 
			
		||||
      [QueryType.ANNOTATION]: 0,
 | 
			
		||||
    };
 | 
			
		||||
    cloudmonitorQueries.forEach((query) => {
 | 
			
		||||
      if (
 | 
			
		||||
        query.queryType === QueryType.TIME_SERIES_QUERY ||
 | 
			
		||||
        query.queryType === QueryType.TIME_SERIES_LIST ||
 | 
			
		||||
        query.queryType === QueryType.SLO ||
 | 
			
		||||
        query.queryType === QueryType.ANNOTATION
 | 
			
		||||
      ) {
 | 
			
		||||
        stats[query.queryType]++;
 | 
			
		||||
      } else if (query.queryType === 'metrics') {
 | 
			
		||||
        if (query.hasOwnProperty('type') && get(query, 'type') === 'annotationQuery') {
 | 
			
		||||
          stats.annotation++;
 | 
			
		||||
        }
 | 
			
		||||
        if (get(query, 'metricQuery.editorMode') === 'mql') {
 | 
			
		||||
          stats.timeSeriesQuery++;
 | 
			
		||||
        } else {
 | 
			
		||||
          stats.timeSeriesList++;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (cloudmonitorQueries && cloudmonitorQueries.length > 0) {
 | 
			
		||||
      trackCloudMonitoringDashboardLoaded({
 | 
			
		||||
        grafana_version: grafanaVersion,
 | 
			
		||||
        dashboard_id: dashboardId,
 | 
			
		||||
        org_id: orgId,
 | 
			
		||||
        mql_queries: stats[QueryType.TIME_SERIES_QUERY],
 | 
			
		||||
        time_series_filter_queries: stats[QueryType.TIME_SERIES_LIST],
 | 
			
		||||
        slo_queries: stats[QueryType.SLO],
 | 
			
		||||
        annotation_queries: stats[QueryType.ANNOTATION],
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										23
									
								
								public/app/plugins/datasource/cloud-monitoring/tracking.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								public/app/plugins/datasource/cloud-monitoring/tracking.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,23 @@
 | 
			
		||||
import { reportInteraction } from '@grafana/runtime';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Loaded the first time a dashboard containing Cloudmonitoring queries is loaded (not on every render)
 | 
			
		||||
 * Note: The queries used here are the ones pre-migration and pre-filterQuery
 | 
			
		||||
 */
 | 
			
		||||
export const trackCloudMonitoringDashboardLoaded = (props: CloudMonitoringDashboardLoadedProps) => {
 | 
			
		||||
  reportInteraction('grafana_ds_cloudmonitoring_dashboard_loaded', props);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export type CloudMonitoringDashboardLoadedProps = {
 | 
			
		||||
  grafana_version?: string;
 | 
			
		||||
  dashboard_id: string;
 | 
			
		||||
  org_id?: number;
 | 
			
		||||
  /** number of non hidden queries of type TimeSeriesQuery (MQL) if any  */
 | 
			
		||||
  mql_queries: number;
 | 
			
		||||
  /** number of non hidden queries of type TimeSeriesFilter (Builder) if any  */
 | 
			
		||||
  time_series_filter_queries: number;
 | 
			
		||||
  /** number of non hidden queries of type SLO if any  */
 | 
			
		||||
  slo_queries: number;
 | 
			
		||||
  /** number of non hidden queries of type annotation if any  */
 | 
			
		||||
  annotation_queries: number;
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user