Divide latency dashboard

There are a lot of latency metrics. This change splits up the existing
dashboard for latencies. For REST API latencies, it also allows to
select the REST API calls to look at. This change also adds latency
dashboards for the NoteDB and UI Actions.

Change-Id: Idb9631cc1bc838d06e626d58f163e71fb78b30c5
diff --git a/dashboards/gerrit/latency/gerrit-latency.jsonnet b/dashboards/gerrit/latency/gerrit-latency.jsonnet
deleted file mode 100644
index 332a0fe..0000000
--- a/dashboards/gerrit/latency/gerrit-latency.jsonnet
+++ /dev/null
@@ -1,110 +0,0 @@
-local grafana = import '../../../vendor/grafonnet/grafana.libsonnet';
-local dashboard = grafana.dashboard;
-local template = grafana.template;
-local graphPanel = grafana.graphPanel;
-local prometheus = grafana.prometheus;
-
-local defaults = import '../../globals/defaults.libsonnet';
-local gridPos = import '../../globals/grid_pos.libsonnet';
-local publishVariables = import '../../globals/publish.libsonnet';
-local variables = import '../globals/variables.libsonnet';
-
-local latency_panel = import './panels/latency.libsonnet';
-
-dashboard.new(
-  'Gerrit - Latency',
-  tags=['gerrit'],
-  schemaVersion=defaults.dashboards.schemaVersion,
-  editable=defaults.dashboards.editable,
-  time_from=defaults.dashboards.timeFrom,
-  time_to=defaults.dashboards.timeTo,
-  refresh=defaults.dashboards.refresh,
-  graphTooltip='shared_tooltip',
-)
-.addTemplate(variables.instance)
-.addTemplate(variables.replica)
-.addPanel(
-  latency_panel.new(
-    metric='receivecommits_latency_total',
-    title='RECEIVE-COMMIT latency'
-  ),
-  gridPos=gridPos.new(0, 0)
-)
-.addPanel(
-  latency_panel.new(
-    metric='http_server_rest_api_server_latency_total',
-    title='REST total latency'
-  ),
-  gridPos=gridPos.new(0, 1)
-)
-.addPanel(
-  latency_panel.new(
-    metric='query_query_latency_total',
-    title='QUERY total latency'
-  ),
-  gridPos=gridPos.new(1, 0)
-)
-.addPanel(
-  latency_panel.new(
-    metric='http_server_rest_api_server_latency_restapi_change_GetDetail',
-    title='REST get change detail latency'
-  ),
-  gridPos=gridPos.new(1, 1)
-)
-.addPanel(
-  latency_panel.new(
-    metric='query_query_latency_changes',
-    title='QUERY changes latency'
-  ),
-  gridPos=gridPos.new(2, 0)
-)
-.addPanel(
-  latency_panel.new(
-    metric='http_server_rest_api_server_latency_restapi_change_GetDiff',
-    title='REST get change diff latency'
-  ),
-  gridPos=gridPos.new(2, 1)
-)
-.addPanel(
-  latency_panel.new(
-    metric='http_server_rest_api_server_latency_restapi_change_ListChangeComments',
-    title='REST change list comments latency'
-  ),
-  gridPos=gridPos.new(3, 0)
-)
-.addPanel(
-  latency_panel.new(
-    metric='http_server_rest_api_server_latency_restapi_change_GetChange',
-    title='REST get change latency'
-  ),
-  gridPos=gridPos.new(3, 1)
-)
-.addPanel(
-  latency_panel.new(
-    metric='http_server_rest_api_server_latency_restapi_change_ListChangeRobotComments',
-    title='REST change list robot comments latency'
-  ),
-  gridPos=gridPos.new(4, 0)
-)
-.addPanel(
-  latency_panel.new(
-    metric='http_server_rest_api_server_latency_restapi_change_GetCommit',
-    title='REST get commit latency'
-  ),
-  gridPos=gridPos.new(4, 1)
-)
-.addPanel(
-  latency_panel.new(
-    metric='http_server_rest_api_server_latency_restapi_change_PostReview',
-    title='REST post change review latency'
-  ),
-  gridPos=gridPos.new(5, 0)
-)
-.addPanel(
-  latency_panel.new(
-    metric='http_server_rest_api_server_latency_restapi_change_GetRevisionActions',
-    title='REST get change revision actions latency'
-  ),
-  gridPos=gridPos.new(5, 1)
-)
-+ if std.extVar('publish') then publishVariables else {}
diff --git a/dashboards/gerrit/latency/gerrit-notedb-latency.jsonnet b/dashboards/gerrit/latency/gerrit-notedb-latency.jsonnet
new file mode 100644
index 0000000..a21c1d3
--- /dev/null
+++ b/dashboards/gerrit/latency/gerrit-notedb-latency.jsonnet
@@ -0,0 +1,48 @@
+local grafana = import '../../../vendor/grafonnet/grafana.libsonnet';
+local dashboard = grafana.dashboard;
+local template = grafana.template;
+local row = grafana.row;
+local graphPanel = grafana.graphPanel;
+local prometheus = grafana.prometheus;
+
+local defaults = import '../../globals/defaults.libsonnet';
+local gridPos = import '../../globals/grid_pos.libsonnet';
+local publishVariables = import '../../globals/publish.libsonnet';
+local variables = import '../globals/variables.libsonnet';
+
+local latency_panel = import './panels/latency.libsonnet';
+
+local ACTIONS = [
+  'update',
+  'stage_update',
+  'read',
+  'parse',
+  'auto_rebuild',
+];
+
+dashboard.new(
+  'Gerrit - NOTEDB Latency',
+  tags=['gerrit'],
+  schemaVersion=defaults.dashboards.schemaVersion,
+  editable=defaults.dashboards.editable,
+  time_from=defaults.dashboards.timeFrom,
+  time_to=defaults.dashboards.timeTo,
+  refresh=defaults.dashboards.refresh,
+  graphTooltip='shared_tooltip',
+)
+.addTemplate(variables.instance)
+.addTemplate(variables.replica)
+.addPanels([
+  latency_panel.new(
+    metric=std.format('notedb_%s_latency_total', ACTIONS[i]),
+    title=std.format('%s notedb latency', std.asciiUpper(ACTIONS[i])),
+  ) { gridPos: {w: 12, h: 11, x: (i%2)*12} }
+  for i in std.range(0, std.length(ACTIONS) - 1)
+])
+.addPanel(
+  latency_panel.new(
+    metric='notedb_read_all_external_ids_latency',
+    title='READ ALL EXTERNAL IDS notedb latency'),
+  gridPos={w: 12, h: 11, x: ((std.length(ACTIONS))%2)*12},
+)
++ if std.extVar('publish') then publishVariables else {}
diff --git a/dashboards/gerrit/latency/gerrit-push-latency.jsonnet b/dashboards/gerrit/latency/gerrit-push-latency.jsonnet
new file mode 100644
index 0000000..e792d23
--- /dev/null
+++ b/dashboards/gerrit/latency/gerrit-push-latency.jsonnet
@@ -0,0 +1,48 @@
+local grafana = import '../../../vendor/grafonnet/grafana.libsonnet';
+local dashboard = grafana.dashboard;
+local template = grafana.template;
+local row = grafana.row;
+local graphPanel = grafana.graphPanel;
+local prometheus = grafana.prometheus;
+
+local defaults = import '../../globals/defaults.libsonnet';
+local gridPos = import '../../globals/grid_pos.libsonnet';
+local publishVariables = import '../../globals/publish.libsonnet';
+local variables = import '../globals/variables.libsonnet';
+
+local latency_panel = import './panels/latency.libsonnet';
+
+dashboard.new(
+  'Gerrit - PUSH Latency',
+  tags=['gerrit'],
+  schemaVersion=defaults.dashboards.schemaVersion,
+  editable=defaults.dashboards.editable,
+  time_from=defaults.dashboards.timeFrom,
+  time_to=defaults.dashboards.timeTo,
+  refresh=defaults.dashboards.refresh,
+  graphTooltip='shared_tooltip',
+)
+.addTemplate(variables.instance)
+.addTemplate(variables.replica)
+.addPanel(
+  latency_panel.new(
+    metric='receivecommits_latency_total',
+    title='TOTAL receive-commits latency'
+  ),
+  gridPos=gridPos.new(0, 0, 1)
+)
+.addPanel(
+  latency_panel.new(
+    metric='receivecommits_latency_AUTOCLOSED',
+    title='AUTOCLOSED receive-commits latency'
+  ),
+  gridPos=gridPos.new(1, 0)
+)
+.addPanel(
+  latency_panel.new(
+    metric='receivecommits_latency_CREATE_REPLACE',
+    title='CREATE/REPLACE receive-commits latency'
+  ),
+  gridPos=gridPos.new(1, 1)
+)
++ if std.extVar('publish') then publishVariables else {}
diff --git a/dashboards/gerrit/latency/gerrit-query-latency.jsonnet b/dashboards/gerrit/latency/gerrit-query-latency.jsonnet
new file mode 100644
index 0000000..a49486d
--- /dev/null
+++ b/dashboards/gerrit/latency/gerrit-query-latency.jsonnet
@@ -0,0 +1,42 @@
+local grafana = import '../../../vendor/grafonnet/grafana.libsonnet';
+local dashboard = grafana.dashboard;
+local template = grafana.template;
+local row = grafana.row;
+local graphPanel = grafana.graphPanel;
+local prometheus = grafana.prometheus;
+
+local defaults = import '../../globals/defaults.libsonnet';
+local gridPos = import '../../globals/grid_pos.libsonnet';
+local publishVariables = import '../../globals/publish.libsonnet';
+local variables = import '../globals/variables.libsonnet';
+
+local latency_panel = import './panels/latency.libsonnet';
+
+local QUERIES = ['accounts', 'changes', 'groups', 'projects'];
+
+dashboard.new(
+  'Gerrit - QUERY Latency',
+  tags=['gerrit'],
+  schemaVersion=defaults.dashboards.schemaVersion,
+  editable=defaults.dashboards.editable,
+  time_from=defaults.dashboards.timeFrom,
+  time_to=defaults.dashboards.timeTo,
+  refresh=defaults.dashboards.refresh,
+  graphTooltip='shared_tooltip',
+)
+.addTemplate(variables.instance)
+.addTemplate(variables.replica)
+.addPanel(latency_panel.new(
+  metric='query_query_latency_total',
+  title='TOTAL query latency',
+),
+gridPos=gridPos.new(0,0,1),
+)
+.addPanels([
+  latency_panel.new(
+    metric=std.format('query_query_latency_%s', QUERIES[i]),
+    title=std.format('%s query latency', std.asciiUpper(QUERIES[i])),
+  ) { gridPos: {w: 12, h: 11, x: (i%2)*12} }
+  for i in std.range(0, std.length(QUERIES) - 1)
+])
++ if std.extVar('publish') then publishVariables else {}
diff --git a/dashboards/gerrit/latency/gerrit-rest-api-latency.jsonnet b/dashboards/gerrit/latency/gerrit-rest-api-latency.jsonnet
new file mode 100644
index 0000000..6156904
--- /dev/null
+++ b/dashboards/gerrit/latency/gerrit-rest-api-latency.jsonnet
@@ -0,0 +1,67 @@
+local grafana = import '../../../vendor/grafonnet/grafana.libsonnet';
+local dashboard = grafana.dashboard;
+local template = grafana.template;
+local row = grafana.row;
+local graphPanel = grafana.graphPanel;
+local prometheus = grafana.prometheus;
+
+local defaults = import '../../globals/defaults.libsonnet';
+local gridPos = import '../../globals/grid_pos.libsonnet';
+local publishVariables = import '../../globals/publish.libsonnet';
+local variables = import '../globals/variables.libsonnet';
+
+local latency_panel = import './panels/latency.libsonnet';
+
+dashboard.new(
+  'Gerrit - REST API Latency',
+  tags=['gerrit'],
+  schemaVersion=defaults.dashboards.schemaVersion,
+  editable=defaults.dashboards.editable,
+  time_from=defaults.dashboards.timeFrom,
+  time_to=defaults.dashboards.timeTo,
+  refresh=defaults.dashboards.refresh,
+  graphTooltip='shared_tooltip',
+)
+.addTemplate(variables.instance)
+.addTemplate(variables.replica)
+.addTemplate(
+  template.new(
+    name='endpoint',
+    datasource='Prometheus',
+    query='metrics(^http_server_rest_api_server_latency_restapi_.+$)',
+    regex='^http_server_rest_api_server_latency_restapi_([^_]+)_.+$',
+    label='Endpoint',
+    refresh='time',
+  )
+)
+.addTemplate(
+  template.new(
+    name='action',
+    datasource='Prometheus',
+    query='metrics(^http_server_rest_api_server_latency_restapi_$endpoint.+$)',
+    regex='^http_server_rest_api_server_latency_restapi_[^_]+_([^_]+)_.+$',
+    label='Action',
+    multi=true,
+    includeAll=true,
+    refresh='time',
+  )
+)
+.addPanel(
+  latency_panel.new(
+    metric='http_server_rest_api_server_latency_total',
+    title='REST total latency'
+  ),
+  gridPos=gridPos.new(0, 0, 1)
+)
+.addPanel(
+  latency_panel.new(
+    metric='http_server_rest_api_server_latency_restapi_${endpoint}_$action',
+    title='REST ${endpoint} $action'
+  ) + {
+    repeat: 'action',
+    repeatDirection: 'h',
+    maxPerRow: 2,
+  },
+  gridPos=gridPos.new(1, 0)
+)
++ if std.extVar('publish') then publishVariables else {}
diff --git a/dashboards/gerrit/latency/gerrit-ui-actions-latency.jsonnet b/dashboards/gerrit/latency/gerrit-ui-actions-latency.jsonnet
new file mode 100644
index 0000000..fd102d8
--- /dev/null
+++ b/dashboards/gerrit/latency/gerrit-ui-actions-latency.jsonnet
@@ -0,0 +1,51 @@
+local grafana = import '../../../vendor/grafonnet/grafana.libsonnet';
+local dashboard = grafana.dashboard;
+local template = grafana.template;
+local row = grafana.row;
+local graphPanel = grafana.graphPanel;
+local prometheus = grafana.prometheus;
+
+local defaults = import '../../globals/defaults.libsonnet';
+local gridPos = import '../../globals/grid_pos.libsonnet';
+local publishVariables = import '../../globals/publish.libsonnet';
+local variables = import '../globals/variables.libsonnet';
+
+local latency_panel = import './panels/latency.libsonnet';
+
+dashboard.new(
+  'Gerrit - UI ACTIONS Latency',
+  tags=['gerrit'],
+  schemaVersion=defaults.dashboards.schemaVersion,
+  editable=defaults.dashboards.editable,
+  time_from=defaults.dashboards.timeFrom,
+  time_to=defaults.dashboards.timeTo,
+  refresh=defaults.dashboards.refresh,
+  graphTooltip='shared_tooltip',
+)
+.addTemplate(variables.instance)
+.addTemplate(variables.replica)
+.addTemplate(
+  template.new(
+    name='action',
+    datasource='Prometheus',
+    query='metrics(^http_server_rest_api_ui_actions_latency_[^_]+$)',
+    regex='^http_server_rest_api_ui_actions_latency_(.+)$',
+    label='Action',
+    multi=true,
+    includeAll=true,
+    current='All',
+    refresh='time',
+  )
+)
+.addPanel(
+  latency_panel.new(
+    metric='http_server_rest_api_ui_actions_latency_$action',
+    title='UI action $action'
+  ) + {
+    repeat: 'action',
+    repeatDirection: 'h',
+    maxPerRow: 2,
+  },
+  gridPos=gridPos.new(1, 0)
+)
++ if std.extVar('publish') then publishVariables else {}
diff --git a/dashboards/globals/yaxis.libsonnet b/dashboards/globals/yaxis.libsonnet
index 3e01a52..dca8c63 100644
--- a/dashboards/globals/yaxis.libsonnet
+++ b/dashboards/globals/yaxis.libsonnet
@@ -10,6 +10,7 @@
   latency: self.new(
     label='Latency',
     format='s',
+    logBase=10,
   ),
   cache_misses: self.new(
     label='Cache Misses',