From c605a10571684c911b908d36dc29ecc0d291bbcb Mon Sep 17 00:00:00 2001 From: Greg Pattison Date: Thu, 30 Oct 2025 13:27:14 -0400 Subject: [PATCH] Modernize f5-bigip-mixin to grafonnet v11 and signals architecture --- .gitignore | 1 + f5-bigip-mixin/{alerts => }/alerts.libsonnet | 22 +- f5-bigip-mixin/config.libsonnet | 47 +- f5-bigip-mixin/dashboards.libsonnet | 225 +++ .../bigip-cluster-overview.libsonnet | 644 -------- .../dashboards/bigip-logs-overview.libsonnet | 35 - .../dashboards/bigip-node-overview.libsonnet | 813 ---------- .../dashboards/bigip-pool-overview.libsonnet | 980 ----------- .../bigip-virtual-server-overview.libsonnet | 1221 -------------- .../dashboards/dashboards.libsonnet | 5 - .../dashboards_out/bigip-node-overview.json | 972 ----------- .../dashboards_out/bigip-pool-overview.json | 1162 ------------- .../bigip-virtual-server-overview.json | 1445 ----------------- ...ew.json => f5-bigip-cluster-overview.json} | 546 +++---- .../dashboards_out/f5-bigip-logs.json | 338 ++++ .../f5-bigip-node-overview.json | 554 +++++++ .../f5-bigip-pool-overview.json | 549 +++++++ .../f5-bigip-virtual-server-overview.json | 657 ++++++++ f5-bigip-mixin/g.libsonnet | 3 + f5-bigip-mixin/jsonnetfile.json | 12 +- f5-bigip-mixin/links.libsonnet | 35 + f5-bigip-mixin/main.libsonnet | 49 + f5-bigip-mixin/mixin.libsonnet | 18 +- f5-bigip-mixin/panels.libsonnet | 505 ++++++ .../prometheus_alerts.yaml | 2 +- f5-bigip-mixin/rows.libsonnet | 92 ++ f5-bigip-mixin/signals/nodes.libsonnet | 162 ++ f5-bigip-mixin/signals/pools.libsonnet | 203 +++ f5-bigip-mixin/signals/system.libsonnet | 50 + .../signals/virtual-servers.libsonnet | 274 ++++ 30 files changed, 3956 insertions(+), 7665 deletions(-) rename f5-bigip-mixin/{alerts => }/alerts.libsonnet (90%) create mode 100644 f5-bigip-mixin/dashboards.libsonnet delete mode 100644 f5-bigip-mixin/dashboards/bigip-cluster-overview.libsonnet delete mode 100644 f5-bigip-mixin/dashboards/bigip-logs-overview.libsonnet delete mode 100644 f5-bigip-mixin/dashboards/bigip-node-overview.libsonnet delete mode 100644 f5-bigip-mixin/dashboards/bigip-pool-overview.libsonnet delete mode 100644 f5-bigip-mixin/dashboards/bigip-virtual-server-overview.libsonnet delete mode 100644 f5-bigip-mixin/dashboards/dashboards.libsonnet delete mode 100644 f5-bigip-mixin/dashboards_out/bigip-node-overview.json delete mode 100644 f5-bigip-mixin/dashboards_out/bigip-pool-overview.json delete mode 100644 f5-bigip-mixin/dashboards_out/bigip-virtual-server-overview.json rename f5-bigip-mixin/dashboards_out/{bigip-cluster-overview.json => f5-bigip-cluster-overview.json} (53%) create mode 100644 f5-bigip-mixin/dashboards_out/f5-bigip-logs.json create mode 100644 f5-bigip-mixin/dashboards_out/f5-bigip-node-overview.json create mode 100644 f5-bigip-mixin/dashboards_out/f5-bigip-pool-overview.json create mode 100644 f5-bigip-mixin/dashboards_out/f5-bigip-virtual-server-overview.json create mode 100644 f5-bigip-mixin/g.libsonnet create mode 100644 f5-bigip-mixin/links.libsonnet create mode 100644 f5-bigip-mixin/main.libsonnet create mode 100644 f5-bigip-mixin/panels.libsonnet create mode 100644 f5-bigip-mixin/rows.libsonnet create mode 100644 f5-bigip-mixin/signals/nodes.libsonnet create mode 100644 f5-bigip-mixin/signals/pools.libsonnet create mode 100644 f5-bigip-mixin/signals/system.libsonnet create mode 100644 f5-bigip-mixin/signals/virtual-servers.libsonnet diff --git a/.gitignore b/.gitignore index d68c86c04..1a57d51f0 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ vendor jsonnetfile.lock.json *.zip +.worktrees diff --git a/f5-bigip-mixin/alerts/alerts.libsonnet b/f5-bigip-mixin/alerts.libsonnet similarity index 90% rename from f5-bigip-mixin/alerts/alerts.libsonnet rename to f5-bigip-mixin/alerts.libsonnet index 5b5260690..788b6b677 100644 --- a/f5-bigip-mixin/alerts/alerts.libsonnet +++ b/f5-bigip-mixin/alerts.libsonnet @@ -1,14 +1,14 @@ { - prometheusAlerts+:: { - groups+: [ + new(this): { + groups: [ { - name: 'bigip-alerts', + name: this.config.uid + '-alerts', rules: [ { alert: 'BigIPLowNodeAvailabilityStatus', expr: ||| 100 * (sum(bigip_node_status_availability_state) / clamp_min(count(bigip_node_status_availability_state), 1)) < %(alertsCriticalNodeAvailability)s - ||| % $._config, + ||| % this.config, 'for': '5m', labels: { severity: 'critical', @@ -19,14 +19,14 @@ ( '{{ printf "%%.0f" $value }} percent of available nodes, ' + 'which is below the threshold of %(alertsCriticalNodeAvailability)s.' - ) % $._config, + ) % this.config, }, }, { alert: 'BigIPServerSideConnectionLimit', expr: ||| max without(instance, job) (100 * bigip_node_serverside_cur_conns / clamp_min(bigip_node_serverside_max_conns, 1)) > %(alertsWarningServerSideConnectionLimit)s - ||| % $._config, + ||| % this.config, 'for': '5m', labels: { severity: 'warning', @@ -37,14 +37,14 @@ ( '{{ printf "%%.0f" $value }} percent of the max number of connections in use on node {{$labels.node}}, ' + 'which is above the threshold of %(alertsWarningServerSideConnectionLimit)s percent.' - ) % $._config, + ) % this.config, }, }, { alert: 'BigIPHighRequestRate', expr: ||| max without(instance, job) (100 * rate(bigip_pool_tot_requests[10m]) / clamp_min(rate(bigip_pool_tot_requests[50m] offset 10m), 1)) > %(alertsCriticalHighRequestRate)s - ||| % $._config, + ||| % this.config, 'for': '10m', labels: { severity: 'warning', @@ -55,14 +55,14 @@ ( '{{ printf "%%.0f" $value }} percent increase in requests on pool {{$labels.pool}}, ' + 'which is above the threshold of %(alertsCriticalHighRequestRate)s.' - ) % $._config, + ) % this.config, }, }, { alert: 'BigIPHighConnectionQueueDepth', expr: ||| max without(instance, job) (100 * rate(bigip_pool_connq_depth[5m])) / clamp_min(rate(bigip_pool_connq_depth[50m] offset 10m), 1) > %(alertsCriticalHighConnectionQueueDepth)s - ||| % $._config, + ||| % this.config, 'for': '5m', labels: { severity: 'warning', @@ -73,7 +73,7 @@ ( '{{ printf "%%.0f" $value }} percent increase in connection queue depth on node {{$labels.pool}}, ' + 'which is above the threshold of %(alertsCriticalHighConnectionQueueDepth)s.' - ) % $._config, + ) % this.config, }, }, ], diff --git a/f5-bigip-mixin/config.libsonnet b/f5-bigip-mixin/config.libsonnet index e0e1ae355..12653bc91 100644 --- a/f5-bigip-mixin/config.libsonnet +++ b/f5-bigip-mixin/config.libsonnet @@ -1,17 +1,40 @@ { - _config+:: { - dashboardTags: ['f5-bigip-mixin'], - dashboardPeriod: 'now-30m', - dashboardTimezone: 'default', - dashboardRefresh: '1m', + local this = self, - // alerts thresholds - alertsCriticalNodeAvailability: 95, // % - alertsWarningServerSideConnectionLimit: 80, // % - alertsCriticalHighRequestRate: 150, // % - alertsCriticalHighConnectionQueueDepth: 75, // % + // Basic filtering + filteringSelector: 'job=~"$job", instance=~"$instance"', + groupLabels: ['job'], + instanceLabels: ['instance'], - enableLokiLogs: false, - filterSelector: 'job=~"syslog"', + // Dashboard settings + dashboardTags: ['f5-bigip-mixin'], + uid: 'f5-bigip', + dashboardNamePrefix: 'F5 BIG-IP', + dashboardRefresh: '1m', + dashboardPeriod: 'now-30m', + dashboardTimezone: 'default', + + // Logs configuration + enableLokiLogs: true, + filterSelector: 'job=~"syslog"', + logLabels: ['job', 'host', 'syslog_facility', 'level'], + extraLogLabels: [], + logsVolumeGroupBy: 'level', + showLogsVolume: true, + + // Alert thresholds + alertsCriticalNodeAvailability: 95, // % + alertsWarningServerSideConnectionLimit: 80, // % + alertsCriticalHighRequestRate: 150, // % + alertsCriticalHighConnectionQueueDepth: 75, // % + + // Metrics source + metricsSource: 'prometheus', + + signals+: { + system: (import './signals/system.libsonnet')(this), + virtualServers: (import './signals/virtual-servers.libsonnet')(this), + pools: (import './signals/pools.libsonnet')(this), + nodes: (import './signals/nodes.libsonnet')(this), }, } diff --git a/f5-bigip-mixin/dashboards.libsonnet b/f5-bigip-mixin/dashboards.libsonnet new file mode 100644 index 000000000..f6ba0deda --- /dev/null +++ b/f5-bigip-mixin/dashboards.libsonnet @@ -0,0 +1,225 @@ +local g = import './g.libsonnet'; +local logslib = import 'logs-lib/logs/main.libsonnet'; + +{ + local root = self, + new(this):: + local prefix = this.config.dashboardNamePrefix; + local links = this.grafana.links; + local tags = this.config.dashboardTags; + local uid = this.config.uid; + local vars = this.grafana.variables; + local annotations = this.grafana.annotations; + local refresh = this.config.dashboardRefresh; + local period = this.config.dashboardPeriod; + local timezone = this.config.dashboardTimezone; + + { + // Cluster Overview Dashboard + 'f5-bigip-cluster-overview.json': + g.dashboard.new(prefix + ' cluster overview') + + g.dashboard.withDescription('Overview of F5 BIG-IP cluster health and top metrics.') + + g.dashboard.withPanels( + g.util.panel.resolveCollapsedFlagOnRows( + g.util.grid.wrapPanels( + [ + this.grafana.rows.clusterOverviewRow, + ] + ) + ) + ) + + root.applyCommon( + vars.multiInstance + [ + // k (top count) variable + g.dashboard.variable.custom.new('k', values=['5', '10', '20', '50']) + + g.dashboard.variable.custom.generalOptions.withLabel('Top node count') + + g.dashboard.variable.custom.generalOptions.withCurrent('5'), + // bigip_partition variable + g.dashboard.variable.query.new('bigip_partition') + + g.dashboard.variable.query.withDatasourceFromVariable(vars.datasources.prometheus) + + g.dashboard.variable.query.queryTypes.withLabelValues('partition', 'bigip_node_status_availability_state{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"}') + + g.dashboard.variable.query.generalOptions.withLabel('BIG-IP partition') + + g.dashboard.variable.query.selectionOptions.withMulti(true) + + g.dashboard.variable.query.selectionOptions.withIncludeAll(true, '.+') + + g.dashboard.variable.query.refresh.onLoad() + + g.dashboard.variable.query.refresh.onTime(), + ], + uid + '-cluster-overview', + tags, + links { clusterOverview+:: {} }, + annotations, + timezone, + refresh, + period + ), + + // Node Overview Dashboard + 'f5-bigip-node-overview.json': + g.dashboard.new(prefix + ' node overview') + + g.dashboard.withDescription('Detailed view of F5 BIG-IP node metrics and status.') + + g.dashboard.withPanels( + g.util.panel.resolveCollapsedFlagOnRows( + g.util.grid.wrapPanels( + [ + this.grafana.rows.nodeStatusRow, + this.grafana.rows.nodeMetricsRow, + ] + ) + ) + ) + + root.applyCommon( + vars.multiInstance + [ + // bigip_node variable + g.dashboard.variable.query.new('bigip_node') + + g.dashboard.variable.query.withDatasourceFromVariable(vars.datasources.prometheus) + + g.dashboard.variable.query.queryTypes.withLabelValues('node', 'bigip_node_status_availability_state{job=~"$job", instance=~"$instance"}') + + g.dashboard.variable.query.generalOptions.withLabel('BIG-IP node') + + g.dashboard.variable.query.selectionOptions.withMulti(true) + + g.dashboard.variable.query.selectionOptions.withIncludeAll(true, '.+') + + g.dashboard.variable.query.refresh.onLoad() + + g.dashboard.variable.query.refresh.onTime(), + // bigip_partition variable + g.dashboard.variable.query.new('bigip_partition') + + g.dashboard.variable.query.withDatasourceFromVariable(vars.datasources.prometheus) + + g.dashboard.variable.query.queryTypes.withLabelValues('partition', 'bigip_node_status_availability_state{job=~"$job", instance=~"$instance", node=~"$bigip_node"}') + + g.dashboard.variable.query.generalOptions.withLabel('BIG-IP partition') + + g.dashboard.variable.query.selectionOptions.withMulti(true) + + g.dashboard.variable.query.selectionOptions.withIncludeAll(true, '.+') + + g.dashboard.variable.query.refresh.onLoad() + + g.dashboard.variable.query.refresh.onTime(), + ], + uid + '-node-overview', + tags, + links { nodeOverview+:: {} }, + annotations, + timezone, + refresh, + period + ), + + // Pool Overview Dashboard + 'f5-bigip-pool-overview.json': + g.dashboard.new(prefix + ' pool overview') + + g.dashboard.withDescription('Detailed view of F5 BIG-IP pool metrics and status.') + + g.dashboard.withPanels( + g.util.panel.resolveCollapsedFlagOnRows( + g.util.grid.wrapPanels( + [ + this.grafana.rows.poolStatusRow, + this.grafana.rows.poolMetricsRow, + ] + ) + ) + ) + + root.applyCommon( + vars.multiInstance + [ + // bigip_pool variable + g.dashboard.variable.query.new('bigip_pool') + + g.dashboard.variable.query.withDatasourceFromVariable(vars.datasources.prometheus) + + g.dashboard.variable.query.queryTypes.withLabelValues('pool', 'bigip_pool_status_availability_state{job=~"$job", instance=~"$instance"}') + + g.dashboard.variable.query.generalOptions.withLabel('BIG-IP pool') + + g.dashboard.variable.query.selectionOptions.withMulti(true) + + g.dashboard.variable.query.selectionOptions.withIncludeAll(true, '.+') + + g.dashboard.variable.query.refresh.onLoad() + + g.dashboard.variable.query.refresh.onTime(), + // bigip_partition variable + g.dashboard.variable.query.new('bigip_partition') + + g.dashboard.variable.query.withDatasourceFromVariable(vars.datasources.prometheus) + + g.dashboard.variable.query.queryTypes.withLabelValues('partition', 'bigip_pool_status_availability_state{job=~"$job", instance=~"$instance", pool=~"$bigip_pool"}') + + g.dashboard.variable.query.generalOptions.withLabel('BIG-IP partition') + + g.dashboard.variable.query.selectionOptions.withMulti(true) + + g.dashboard.variable.query.selectionOptions.withIncludeAll(true, '.+') + + g.dashboard.variable.query.refresh.onLoad() + + g.dashboard.variable.query.refresh.onTime(), + ], + uid + '-pool-overview', + tags, + links { poolOverview+:: {} }, + annotations, + timezone, + refresh, + period + ), + + // Virtual Server Overview Dashboard + 'f5-bigip-virtual-server-overview.json': + g.dashboard.new(prefix + ' virtual server overview') + + g.dashboard.withDescription('Detailed view of F5 BIG-IP virtual server metrics and status.') + + g.dashboard.withPanels( + g.util.panel.resolveCollapsedFlagOnRows( + g.util.grid.wrapPanels( + [ + this.grafana.rows.virtualServerStatusRow, + this.grafana.rows.virtualServerClientsideMetricsRow, + this.grafana.rows.virtualServerEphemeralMetricsRow, + ] + ) + ) + ) + + root.applyCommon( + vars.multiInstance + [ + // bigip_virtual_server variable + g.dashboard.variable.query.new('bigip_virtual_server') + + g.dashboard.variable.query.withDatasourceFromVariable(vars.datasources.prometheus) + + g.dashboard.variable.query.queryTypes.withLabelValues('virtual_server', 'bigip_vs_status_availability_state{job=~"$job", instance=~"$instance"}') + + g.dashboard.variable.query.generalOptions.withLabel('BIG-IP virtual server') + + g.dashboard.variable.query.selectionOptions.withMulti(true) + + g.dashboard.variable.query.selectionOptions.withIncludeAll(true, '.+') + + g.dashboard.variable.query.refresh.onLoad() + + g.dashboard.variable.query.refresh.onTime(), + // bigip_partition variable + g.dashboard.variable.query.new('bigip_partition') + + g.dashboard.variable.query.withDatasourceFromVariable(vars.datasources.prometheus) + + g.dashboard.variable.query.queryTypes.withLabelValues('partition', 'bigip_vs_status_availability_state{job=~"$job", instance=~"$instance", virtual_server=~"$bigip_virtual_server"}') + + g.dashboard.variable.query.generalOptions.withLabel('BIG-IP partition') + + g.dashboard.variable.query.selectionOptions.withMulti(true) + + g.dashboard.variable.query.selectionOptions.withIncludeAll(true, '.+') + + g.dashboard.variable.query.refresh.onLoad() + + g.dashboard.variable.query.refresh.onTime(), + ], + uid + '-virtual-server-overview', + tags, + links { virtualServerOverview+:: {} }, + annotations, + timezone, + refresh, + period + ), + } + + + if this.config.enableLokiLogs then + { + 'f5-bigip-logs.json': + logslib.new( + prefix + ' logs', + datasourceName=vars.datasources.loki.name, + datasourceRegex=vars.datasources.loki.regex, + filterSelector=this.config.filterSelector, + labels=this.config.logLabels, + formatParser=null, + showLogsVolume=this.config.showLogsVolume, + logsVolumeGroupBy=this.config.logsVolumeGroupBy, + ) + { + dashboards+: + { + logs+: + g.dashboard.withUid(uid + '-logs') + + g.dashboard.withTags(tags) + + g.dashboard.withRefresh(refresh) + + g.dashboard.withLinks(std.objectValues(links { logs+:: {} })) + + g.panel.logs.options.withShowTime(false), + }, + }.dashboards.logs, + } else {}, + + applyCommon(vars, uid, tags, links, annotations, timezone, refresh, period): + g.dashboard.withTags(tags) + + g.dashboard.withUid(uid) + + g.dashboard.withLinks(std.objectValues(links)) + + g.dashboard.withTimezone(timezone) + + g.dashboard.withRefresh(refresh) + + g.dashboard.time.withFrom(period) + + g.dashboard.withVariables(vars) + + g.dashboard.withAnnotations(std.objectValues(annotations)), +} diff --git a/f5-bigip-mixin/dashboards/bigip-cluster-overview.libsonnet b/f5-bigip-mixin/dashboards/bigip-cluster-overview.libsonnet deleted file mode 100644 index 0078aa668..000000000 --- a/f5-bigip-mixin/dashboards/bigip-cluster-overview.libsonnet +++ /dev/null @@ -1,644 +0,0 @@ -local grafana = (import 'grafonnet/grafana.libsonnet'); -local dashboard = grafana.dashboard; -local template = grafana.template; -local prometheus = grafana.prometheus; -local dashboardUid = 'bigip-cluster-overview'; - -local promDatasourceName = 'datasource'; - -local promDatasource = { - uid: '${%s}' % promDatasourceName, -}; - -local nodeAvailabilityPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - '100 * sum by(partition, instance, job) (bigip_node_status_availability_state{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"}) / clamp_min(count by(partition, instance, job) (bigip_node_status_availability_state{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"}),1)', - datasource=promDatasource, - legendFormat='{{instance}}', - format='time_series', - ), - ], - type: 'gauge', - title: 'Node availability', - description: 'The percentage of nodes available.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'red', - value: null, - }, - { - color: 'red', - value: 95, - }, - { - color: 'yellow', - value: 96, - }, - { - color: 'green', - value: 100, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - minVizHeight: 75, - minVizWidth: 75, - orientation: 'auto', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showThresholdLabels: false, - showThresholdMarkers: true, - }, - pluginVersion: '10.2.0-60139', -}; - -local poolAvailabilityPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - '100 * sum by(partition, instance, job) (bigip_pool_status_availability_state{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"}) / clamp_min(count by(partition, instance, job) (bigip_pool_status_availability_state{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"}),1)', - datasource=promDatasource, - legendFormat='{{instance}}', - format='time_series', - ), - ], - type: 'gauge', - title: 'Pool availability', - description: 'The percentage of pools available.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'red', - value: null, - }, - { - color: 'red', - value: 95, - }, - { - color: 'yellow', - value: 96, - }, - { - color: 'green', - value: 100, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - minVizHeight: 75, - minVizWidth: 75, - orientation: 'auto', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showThresholdLabels: false, - showThresholdMarkers: true, - }, - pluginVersion: '10.2.0-60139', -}; - -local virtualServerAvailabilityPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - '100 * sum by(partition, instance, job) (bigip_vs_status_availability_state{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"}) / clamp_min(count by(partition, instance, job) (bigip_vs_status_availability_state{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"}),1)', - datasource=promDatasource, - legendFormat='{{instance}}', - format='time_series', - ), - ], - type: 'gauge', - title: 'Virtual server availability', - description: 'The percentage of virtual servers available.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'red', - value: null, - }, - { - color: 'red', - value: 95, - }, - { - color: 'yellow', - value: 96, - }, - { - color: 'green', - value: 100, - }, - ], - }, - unit: 'percent', - }, - overrides: [], - }, - options: { - minVizHeight: 75, - minVizWidth: 75, - orientation: 'auto', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showThresholdLabels: false, - showThresholdMarkers: true, - }, - pluginVersion: '10.2.0-60139', -}; - -local topActiveServersideNodesPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'topk($k, bigip_node_serverside_cur_conns{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"})', - datasource=promDatasource, - legendFormat='{{node}} - {{instance}}', - format='time_series', - ), - ], - type: 'bargauge', - title: 'Top active server-side nodes', - description: 'Nodes with the highest number of active server-side connections.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - mappings: [], - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - displayMode: 'gradient', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - valueMode: 'color', - }, - pluginVersion: '10.2.0-60139', -}; - -local topOutboundTrafficNodesPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'topk($k, increase(bigip_node_serverside_bytes_out{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"}[$__interval:]))', - datasource=promDatasource, - legendFormat='{{node}} - {{instance}}', - format='time_series', - interval='1m', - ), - ], - type: 'bargauge', - title: 'Top outbound traffic nodes / $__interval', - description: 'Nodes with the highest outbound traffic.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - mappings: [], - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'decbytes', - }, - overrides: [], - }, - options: { - displayMode: 'gradient', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - valueMode: 'color', - }, - pluginVersion: '10.2.0-60139', -}; - -local topActiveMembersInPoolsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'topk($k, bigip_pool_active_member_cnt{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"})', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}}', - format='time_series', - ), - ], - type: 'bargauge', - title: 'Top active members in pools', - description: 'Pools with the highest number of active members.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - mappings: [], - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - displayMode: 'gradient', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - valueMode: 'color', - }, - pluginVersion: '10.2.0-60139', -}; - -local topRequestedPoolsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'topk($k, increase(bigip_pool_tot_requests{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"}[$__interval:]))', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}}', - format='time_series', - interval='1m', - ), - ], - type: 'bargauge', - title: 'Top requested pools / $__interval', - description: 'Pools with the highest number of requests.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - mappings: [], - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - displayMode: 'gradient', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - valueMode: 'color', - }, - pluginVersion: '10.2.0-60139', -}; - -local topQueueDepthPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'topk($k, bigip_pool_connq_depth{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"})', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}}', - format='time_series', - ), - ], - type: 'bargauge', - title: 'Top queue depth', - description: 'Pools with the largest connection queues.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - mappings: [], - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - displayMode: 'gradient', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - valueMode: 'color', - }, - pluginVersion: '10.2.0-60139', -}; - -local topUtilizedVirtualServersPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'topk($k, increase(bigip_vs_clientside_bytes_in{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"}[$__interval:])) + topk(5, increase(bigip_vs_clientside_bytes_out{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"}[$__interval:]))', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - format='time_series', - interval='1m', - ), - ], - type: 'bargauge', - title: 'Top utilized virtual servers / $__interval', - description: 'Virtual servers with the highest traffic (inbound and outbound).', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - mappings: [], - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'decbytes', - }, - overrides: [], - }, - options: { - displayMode: 'gradient', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - valueMode: 'color', - }, - pluginVersion: '10.2.0-60139', -}; - -local topLatencyVirtualServersPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'topk($k, bigip_vs_cs_mean_conn_dur{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"})', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - format='time_series', - ), - ], - type: 'bargauge', - title: 'Top latency virtual servers', - description: 'Virtual servers with the highest response times.', - fieldConfig: { - defaults: { - color: { - mode: 'thresholds', - }, - mappings: [], - min: 0, - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'ms', - }, - overrides: [], - }, - options: { - displayMode: 'gradient', - minVizHeight: 10, - minVizWidth: 0, - orientation: 'horizontal', - reduceOptions: { - calcs: [ - 'lastNotNull', - ], - fields: '', - values: false, - }, - showUnfilled: true, - valueMode: 'color', - }, - pluginVersion: '10.2.0-60139', -}; - -{ - grafanaDashboards+:: { - 'bigip-cluster-overview.json': - dashboard.new( - 'BIG-IP cluster overview', - time_from='%s' % $._config.dashboardPeriod, - tags=($._config.dashboardTags), - timezone='%s' % $._config.dashboardTimezone, - refresh='%s' % $._config.dashboardRefresh, - description='', - uid=dashboardUid, - ) - .addLink(grafana.link.dashboards( - asDropdown=false, - title='Other BIG-IP dashboards', - includeVars=true, - keepTime=true, - tags=($._config.dashboardTags), - )) - .addTemplates( - [ - template.datasource( - promDatasourceName, - 'prometheus', - null, - label='Data Source', - refresh='load' - ), - template.new( - 'job', - promDatasource, - 'label_values(bigip_node_status_availability_state,job)', - label='Job', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - template.new( - 'instance', - promDatasource, - 'label_values(bigip_node_status_availability_state{job=~"$job"}, instance)', - label='Instance', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - template.custom( - 'k', - query='5,10,20,50', - current='5', - label='Top node count', - refresh='never', - includeAll=false, - multi=false, - allValues='', - ), - template.new( - 'bigip_partition', - promDatasource, - 'label_values(bigip_node_status_availability_state{job=~"$job", instance=~"$instance", partition=~"$bigip_partition"},partition)', - label='BIG-IP partition', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - ] - ) - .addPanels( - [ - nodeAvailabilityPanel { gridPos: { h: 5, w: 8, x: 0, y: 0 } }, - poolAvailabilityPanel { gridPos: { h: 5, w: 8, x: 8, y: 0 } }, - virtualServerAvailabilityPanel { gridPos: { h: 5, w: 8, x: 16, y: 0 } }, - topActiveServersideNodesPanel { gridPos: { h: 5, w: 12, x: 0, y: 5 } }, - topOutboundTrafficNodesPanel { gridPos: { h: 5, w: 12, x: 12, y: 5 } }, - topActiveMembersInPoolsPanel { gridPos: { h: 5, w: 8, x: 0, y: 10 } }, - topRequestedPoolsPanel { gridPos: { h: 5, w: 8, x: 8, y: 10 } }, - topQueueDepthPanel { gridPos: { h: 5, w: 8, x: 16, y: 9 } }, - topUtilizedVirtualServersPanel { gridPos: { h: 5, w: 12, x: 0, y: 15 } }, - topLatencyVirtualServersPanel { gridPos: { h: 5, w: 12, x: 12, y: 15 } }, - ] - ), - }, -} diff --git a/f5-bigip-mixin/dashboards/bigip-logs-overview.libsonnet b/f5-bigip-mixin/dashboards/bigip-logs-overview.libsonnet deleted file mode 100644 index 8e35acd33..000000000 --- a/f5-bigip-mixin/dashboards/bigip-logs-overview.libsonnet +++ /dev/null @@ -1,35 +0,0 @@ -local g = import 'github.com/grafana/grafonnet/gen/grafonnet-latest/main.libsonnet'; -local logsDashboard = import 'github.com/grafana/jsonnet-libs/logs-lib/logs/main.libsonnet'; - -{ - grafanaDashboards+:: - if $._config.enableLokiLogs then - { - local bigIPLogsPanel = - logsDashboard.new( - 'BIG-IP logs', - datasourceName='loki_datasource', - datasourceRegex='(?!grafanacloud.+usage-insights|grafanacloud.+alert-state-history).+', - filterSelector=$._config.filterSelector, - labels=['job', 'host', 'syslog_facility', 'level'], - formatParser=null, - showLogsVolume=true - ) - { - panels+: - { - logs+: - // BIG-IP logs already have timestamp - g.panel.logs.options.withShowTime(false), - }, - dashboards+: - { - logs+: g.dashboard.withLinksMixin($.grafanaDashboards['bigip-cluster-overview.json'].links) - + g.dashboard.withUid('bigip-logs-overview') - + g.dashboard.withTags($._config.dashboardTags) - + g.dashboard.withRefresh($._config.dashboardRefresh), - }, - }, - 'bigip-logs-overview.json': bigIPLogsPanel.dashboards.logs, - } else {}, -} diff --git a/f5-bigip-mixin/dashboards/bigip-node-overview.libsonnet b/f5-bigip-mixin/dashboards/bigip-node-overview.libsonnet deleted file mode 100644 index 327a0ce8f..000000000 --- a/f5-bigip-mixin/dashboards/bigip-node-overview.libsonnet +++ /dev/null @@ -1,813 +0,0 @@ -local grafana = (import 'grafonnet/grafana.libsonnet'); -local dashboard = grafana.dashboard; -local template = grafana.template; -local prometheus = grafana.prometheus; - -local dashboardUid = 'bigip-node-overview'; - -local promDatasourceName = 'datasource'; - -local promDatasource = { - uid: '${%s}' % promDatasourceName, -}; - -local availabilityStatusPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bigip_node_status_availability_state{job=~"$job", instance=~"$instance", node=~"$bigip_node", partition=~"$bigip_partition"}', - datasource=promDatasource, - intervalFactor=2, - instant=true, - legendFormat='{{node}} - {{instance}}', - format='table', - ), - ], - type: 'table', - title: 'Availability status', - description: 'The availability status of the node.', - fieldConfig: { - defaults: { - color: { - mode: 'fixed', - }, - custom: { - align: 'left', - cellOptions: { - type: 'color-text', - }, - inspect: false, - }, - mappings: [ - { - options: { - '0': { - color: 'red', - index: 1, - text: 'Unavailable', - }, - '1': { - color: 'green', - index: 0, - text: 'Available', - }, - }, - type: 'value', - }, - ], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [ - { - matcher: { - id: 'byName', - options: 'Time', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'job', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: '__name__', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'partition', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'instance', - }, - properties: [ - { - id: 'displayName', - value: 'Instance', - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'node', - }, - properties: [ - { - id: 'displayName', - value: 'Node', - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'Value', - }, - properties: [ - { - id: 'displayName', - value: 'Status', - }, - ], - }, - ], - }, - options: { - cellHeight: 'sm', - footer: { - countRows: false, - fields: [], - reducer: [ - 'sum', - ], - show: false, - }, - showHeader: true, - }, - pluginVersion: '10.2.0-60139', -}; - -local activeSessionsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bigip_node_cur_sessions{job=~"$job", instance=~"$instance", node=~"$bigip_node", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{node}} - {{instance}}', - format='time_series', - ), - ], - type: 'timeseries', - title: 'Active sessions', - description: 'The current number of active sessions to the node.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local requests__intervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_node_tot_requests{job=~"$job", instance=~"$instance", node=~"$bigip_node", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{node}} - {{instance}}', - format='time_series', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Requests / $__interval', - description: 'The number of requests made to the node.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local connectionsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bigip_node_serverside_cur_conns{job=~"$job", instance=~"$instance", node=~"$bigip_node", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{node}} - {{instance}} - current', - format='time_series', - ), - prometheus.target( - 'bigip_node_serverside_max_conns{job=~"$job", instance=~"$instance", node=~"$bigip_node", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{node}} - {{instance}} - max', - format='time_series', - ), - ], - type: 'timeseries', - title: 'Connections', - description: 'The current active server-side connections to the node in comparison to the maximum connection capacity.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [ - 'min', - 'mean', - 'max', - ], - displayMode: 'table', - placement: 'right', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local trafficInboundPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'rate(bigip_node_serverside_bytes_in{job=~"$job", instance=~"$instance", node=~"$bigip_node", partition=~"$bigip_partition"}[$__rate_interval])', - datasource=promDatasource, - legendFormat='{{node}} - {{instance}}', - format='time_series', - ), - ], - type: 'timeseries', - title: 'Traffic inbound', - description: 'The rate of data received from the pool by the node.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'Bps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; -local trafficOutboundPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'rate(bigip_node_serverside_bytes_out{job=~"$job", instance=~"$instance", node=~"$bigip_node", partition=~"$bigip_partition"}[$__rate_interval])', - datasource=promDatasource, - legendFormat='{{node}} - {{instance}}', - ), - ], - type: 'timeseries', - title: 'Traffic outbound', - description: 'The rate of data sent from the pool by the node.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'Bps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local packetsInboundIntervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_node_serverside_pkts_in{job=~"$job", instance=~"$instance", node=~"$bigip_node", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{node}} - {{instance}}', - format='time_series', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Packets inbound / $__interval', - description: 'The number of packets received by the node from the pool.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local packetsOutboundIntervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_node_serverside_pkts_out{job=~"$job", instance=~"$instance", node=~"$bigip_node", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{node}} - {{instance}}', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Packets outbound / $__interval', - description: 'The number of packets sent by the node from the pool.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -{ - grafanaDashboards+:: { - 'bigip-node-overview.json': - dashboard.new( - 'BIG-IP node overview', - time_from='%s' % $._config.dashboardPeriod, - tags=($._config.dashboardTags), - timezone='%s' % $._config.dashboardTimezone, - refresh='%s' % $._config.dashboardRefresh, - description='', - uid=dashboardUid, - ) - .addLink(grafana.link.dashboards( - asDropdown=false, - title='Other BIG-IP dashboards', - includeVars=true, - keepTime=true, - tags=($._config.dashboardTags), - )) - .addTemplates( - std.flattenArrays([ - [ - template.datasource( - promDatasourceName, - 'prometheus', - null, - label='Data Source', - refresh='load' - ), - ], - [ - template.new( - 'job', - promDatasource, - 'label_values(bigip_node_status_availability_state,job)', - label='Job', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - template.new( - 'instance', - promDatasource, - 'label_values(bigip_node_status_availability_state{job=~"$job"}, instance)', - label='Instance', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - template.new( - 'bigip_node', - promDatasource, - 'label_values(bigip_node_status_availability_state{job=~"$job", instance=~"$instance"},node)', - label='BIG-IP node', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - template.new( - 'bigip_partition', - promDatasource, - 'label_values(bigip_node_status_availability_state{job=~"$job", instance=~"$instance"},partition)', - label='BIG-IP partition', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - ], - ]) - ) - .addPanels( - std.flattenArrays([ - [ - availabilityStatusPanel { gridPos: { h: 5, w: 8, x: 0, y: 0 } }, - requests__intervalPanel { gridPos: { h: 5, w: 8, x: 8, y: 0 } }, - activeSessionsPanel { gridPos: { h: 5, w: 8, x: 16, y: 0 } }, - connectionsPanel { gridPos: { h: 5, w: 24, x: 0, y: 5 } }, - trafficInboundPanel { gridPos: { h: 5, w: 12, x: 0, y: 10 } }, - trafficOutboundPanel { gridPos: { h: 5, w: 12, x: 12, y: 10 } }, - packetsInboundIntervalPanel { gridPos: { h: 5, w: 12, x: 0, y: 15 } }, - packetsOutboundIntervalPanel { gridPos: { h: 5, w: 12, x: 12, y: 15 } }, - ], - ]) - ), - }, -} diff --git a/f5-bigip-mixin/dashboards/bigip-pool-overview.libsonnet b/f5-bigip-mixin/dashboards/bigip-pool-overview.libsonnet deleted file mode 100644 index 11df0c891..000000000 --- a/f5-bigip-mixin/dashboards/bigip-pool-overview.libsonnet +++ /dev/null @@ -1,980 +0,0 @@ -local grafana = (import 'grafonnet/grafana.libsonnet'); -local dashboard = grafana.dashboard; -local template = grafana.template; -local prometheus = grafana.prometheus; - -local dashboardUid = 'bigip-pool-overview'; - -local promDatasourceName = 'prometheus_datasource'; - -local promDatasource = { - uid: '${%s}' % promDatasourceName, -}; - -local availabilityStatusPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bigip_pool_status_availability_state{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}}', - intervalFactor=2, - instant=true, - format='table', - ), - ], - type: 'table', - title: 'Availability status', - description: 'The availability status of the pool.', - fieldConfig: { - defaults: { - color: { - mode: 'fixed', - }, - custom: { - align: 'left', - cellOptions: { - type: 'color-text', - }, - inspect: false, - }, - mappings: [ - { - options: { - '0': { - color: 'red', - index: 1, - text: 'Unavailable', - }, - '1': { - color: 'green', - index: 0, - text: 'Available', - }, - }, - type: 'value', - }, - ], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [ - { - matcher: { - id: 'byName', - options: 'Time', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'job', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: '__name__', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'partition', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'instance', - }, - properties: [ - { - id: 'displayName', - value: 'Instance', - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'pool', - }, - properties: [ - { - id: 'displayName', - value: 'Pool', - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'Value', - }, - properties: [ - { - id: 'displayName', - value: 'Status', - }, - ], - }, - ], - }, - options: { - cellHeight: 'sm', - footer: { - countRows: false, - fields: [], - reducer: [ - 'sum', - ], - show: false, - }, - showHeader: true, - }, - pluginVersion: '10.2.0-60139', -}; - -local requests__intervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_pool_tot_requests{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}}', - format='time_series', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Requests / $__interval', - description: 'The number of requests made to the pool.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local membersPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bigip_pool_active_member_cnt{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}} - active', - format='time_series', - ), - prometheus.target( - 'bigip_pool_min_active_members{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}} - minimum', - format='time_series', - ), - ], - type: 'timeseries', - title: 'Members', - description: 'The number of active and minimum required members within the pool.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [ - 'min', - 'mean', - 'max', - ], - displayMode: 'table', - placement: 'right', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local connectionsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bigip_pool_serverside_cur_conns{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}} - current', - format='time_series', - ), - prometheus.target( - 'bigip_pool_serverside_max_conns{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}} - maximum', - format='time_series', - ), - ], - type: 'timeseries', - title: 'Connections', - description: 'The current and maximum number of node connections within the pool.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [ - 'min', - 'mean', - 'max', - ], - displayMode: 'table', - placement: 'right', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local connectionQueueDepthPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bigip_pool_connq_depth{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}}', - format='time_series', - ), - ], - type: 'timeseries', - title: 'Connection queue depth', - description: 'The depth of connection queues within the pool, including the current depth.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local connectionQueueServiced__intervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_pool_connq_serviced{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}}', - format='time_series', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Connection queue serviced / $__interval', - description: 'The number of connections that have been serviced within the pool.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local trafficInboundPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'rate(bigip_pool_serverside_bytes_in{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}[$__rate_interval])', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}}', - format='time_series', - ), - ], - type: 'timeseries', - title: 'Traffic inbound', - description: 'The rate of date received from virtual servers by the pool.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'Bps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local trafficOutboundPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'rate(bigip_pool_serverside_bytes_out{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}[$__rate_interval])', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}}', - ), - ], - type: 'timeseries', - title: 'Traffic outbound', - description: 'The rate of date sent from virtual servers by the pool.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'Bps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local packetsInboundIntervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_pool_serverside_pkts_out{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}}', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Packets inbound / $__interval', - description: 'The number of packets received from virtual servers by the pool.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local packetsOutboundIntervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_pool_serverside_pkts_out{job=~"$job", instance=~"$instance", pool=~"$bigip_pool", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{pool}} - {{instance}}', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Packets outbound / $__interval', - description: 'The number of packets sent from virtual servers by the pool.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -{ - grafanaDashboards+:: { - 'bigip-pool-overview.json': - dashboard.new( - 'BIG-IP pool overview', - time_from='%s' % $._config.dashboardPeriod, - tags=($._config.dashboardTags), - timezone='%s' % $._config.dashboardTimezone, - refresh='%s' % $._config.dashboardRefresh, - description='', - uid=dashboardUid, - ) - .addLink(grafana.link.dashboards( - asDropdown=false, - title='Other BIG-IP dashboards', - includeVars=true, - keepTime=true, - tags=($._config.dashboardTags), - )) - .addTemplates( - std.flattenArrays([ - [ - template.datasource( - promDatasourceName, - 'prometheus', - null, - label='Data Source', - refresh='load' - ), - ], - [ - template.new( - 'job', - promDatasource, - 'label_values(bigip_pool_status_availability_state,job)', - label='Job', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - template.new( - 'instance', - promDatasource, - 'label_values(bigip_pool_status_availability_state{job=~"$job"}, instance)', - label='Instance', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - template.new( - 'bigip_pool', - promDatasource, - 'label_values(bigip_pool_status_availability_state{job=~"$job", instance=~"$instance"},pool)', - label='BIG-IP pool', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - template.new( - 'bigip_partition', - promDatasource, - 'label_values(bigip_pool_status_availability_state{job=~"$job", instance=~"$instance"},partition)', - label='BIG-IP partition', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - ], - ]) - ) - .addPanels( - std.flattenArrays([ - [ - availabilityStatusPanel { gridPos: { h: 5, w: 12, x: 0, y: 0 } }, - requests__intervalPanel { gridPos: { h: 5, w: 12, x: 12, y: 0 } }, - membersPanel { gridPos: { h: 5, w: 24, x: 0, y: 5 } }, - connectionsPanel { gridPos: { h: 5, w: 24, x: 0, y: 10 } }, - connectionQueueDepthPanel { gridPos: { h: 5, w: 12, x: 0, y: 15 } }, - connectionQueueServiced__intervalPanel { gridPos: { h: 5, w: 12, x: 12, y: 15 } }, - trafficInboundPanel { gridPos: { h: 5, w: 12, x: 0, y: 20 } }, - trafficOutboundPanel { gridPos: { h: 5, w: 12, x: 12, y: 20 } }, - packetsInboundIntervalPanel { gridPos: { h: 5, w: 12, x: 0, y: 25 } }, - packetsOutboundIntervalPanel { gridPos: { h: 5, w: 12, x: 12, y: 25 } }, - ], - ]) - ), - }, -} diff --git a/f5-bigip-mixin/dashboards/bigip-virtual-server-overview.libsonnet b/f5-bigip-mixin/dashboards/bigip-virtual-server-overview.libsonnet deleted file mode 100644 index 47d940bc3..000000000 --- a/f5-bigip-mixin/dashboards/bigip-virtual-server-overview.libsonnet +++ /dev/null @@ -1,1221 +0,0 @@ -local grafana = (import 'grafonnet/grafana.libsonnet'); -local dashboard = grafana.dashboard; -local template = grafana.template; -local prometheus = grafana.prometheus; -local dashboardUid = 'bigip-virtual-server-overview'; - -local promDatasourceName = 'datasource'; - -local promDatasource = { - uid: '${%s}' % promDatasourceName, -}; - -local availabilityStatusPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bigip_vs_status_availability_state{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - intervalFactor=2, - instant=true, - format='table', - ), - ], - type: 'table', - title: 'Availability status', - description: 'The availability status of the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'fixed', - }, - custom: { - align: 'left', - cellOptions: { - type: 'color-text', - }, - inspect: false, - }, - mappings: [ - { - options: { - '0': { - color: 'red', - index: 1, - text: 'Unavailable', - }, - '1': { - color: 'green', - index: 0, - text: 'Available', - }, - }, - type: 'value', - }, - ], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [ - { - matcher: { - id: 'byName', - options: 'Time', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'job', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: '__name__', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'partition', - }, - properties: [ - { - id: 'custom.hidden', - value: true, - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'instance', - }, - properties: [ - { - id: 'displayName', - value: 'Instance', - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'vs', - }, - properties: [ - { - id: 'displayName', - value: 'Virtual server', - }, - ], - }, - { - matcher: { - id: 'byName', - options: 'Value', - }, - properties: [ - { - id: 'displayName', - value: 'Status', - }, - ], - }, - ], - }, - options: { - cellHeight: 'sm', - footer: { - countRows: false, - fields: [], - reducer: [ - 'sum', - ], - show: false, - }, - showHeader: true, - }, - pluginVersion: '10.2.0-60139', -}; - -local requests__intervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_vs_tot_requests{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - format='time_series', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Requests / $__interval', - description: 'The number of requests made to the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local connectionsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bigip_vs_clientside_cur_conns{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}} - current', - format='time_series', - ), - prometheus.target( - 'bigip_vs_clientside_max_conns{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}} - maximum', - format='time_series', - ), - prometheus.target( - 'bigip_vs_clientside_evicted_conns{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}} - evicted', - ), - ], - type: 'timeseries', - title: 'Connections', - description: 'The evicted and current client-side connections within the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [ - 'min', - 'mean', - 'max', - ], - displayMode: 'table', - placement: 'right', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local ephemeralConnectionsPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bigip_vs_ephemeral_cur_conns{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}} - current', - ), - prometheus.target( - 'bigip_vs_ephemeral_max_conns{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}} - maximum', - ), - prometheus.target( - 'bigip_vs_ephemeral_evicted_conns{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}} - evicted', - ), - ], - type: 'timeseries', - title: 'Ephemeral connections', - description: 'The ephemeral evicted and current client-side connections within the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [ - 'min', - 'mean', - 'max', - ], - displayMode: 'table', - placement: 'right', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local averageConnectionDurationPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'bigip_vs_cs_mean_conn_dur{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - format='time_series', - ), - ], - type: 'timeseries', - title: 'Average connection duration', - description: 'The average connection duration within the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'ms', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local trafficInboundPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'rate(bigip_vs_clientside_bytes_in{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}[$__rate_interval])', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - format='time_series', - ), - ], - type: 'timeseries', - title: 'Traffic inbound', - description: 'The rate of data received from clients by the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'Bps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local trafficOutboundPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'rate(bigip_vs_clientside_bytes_out{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}[$__rate_interval])', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - ), - ], - type: 'timeseries', - title: 'Traffic outbound', - description: 'The rate of data sent from clients by the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'Bps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local trafficInboundEphemeralPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'rate(bigip_vs_ephemeral_bytes_in{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}[$__rate_interval])', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - format='time_series', - ), - ], - type: 'timeseries', - title: 'Ephemeral traffic inbound', - description: 'The rate of ephemeral data received from clients by the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'Bps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local trafficOutboundEphemeralPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'rate(bigip_vs_ephemeral_bytes_out{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}[$__rate_interval])', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - ), - ], - type: 'timeseries', - title: 'Ephemeral traffic outbound', - description: 'The rate of ephemeral data sent from clients by the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'Bps', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local packetsInboundIntervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_vs_clientside_pkts_in{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - format='time_series', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Packets inbound / $__interval', - description: 'The number of packets received by the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local packetsOutboundIntervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_vs_clientside_pkts_out{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Packets outbound / $__interval', - description: 'The number of packets sent by the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local packetsEphemeralInboundntervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_vs_ephemeral_pkts_in{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - format='time_series', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Ephemeral packets inbound / $__interval', - description: 'The number of ephemeral packets received by the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -local packetsEphemeralOutboundIntervalPanel = { - datasource: promDatasource, - targets: [ - prometheus.target( - 'increase(bigip_vs_ephemeral_pkts_out{job=~"$job", instance=~"$instance", vs=~"$bigip_virtual_server", partition=~"$bigip_partition"}[$__interval:])', - datasource=promDatasource, - legendFormat='{{vs}} - {{instance}}', - interval='1m', - ), - ], - type: 'timeseries', - title: 'Ephemeral packets outbound / $__interval', - description: 'The number of ephemeral packets sent by the virtual server.', - fieldConfig: { - defaults: { - color: { - mode: 'palette-classic', - }, - custom: { - axisCenteredZero: false, - axisColorMode: 'text', - axisLabel: '', - axisPlacement: 'auto', - barAlignment: 0, - drawStyle: 'line', - fillOpacity: 30, - gradientMode: 'none', - hideFrom: { - legend: false, - tooltip: false, - viz: false, - }, - insertNulls: false, - lineInterpolation: 'smooth', - lineWidth: 2, - pointSize: 5, - scaleDistribution: { - type: 'linear', - }, - showPoints: 'never', - spanNulls: false, - stacking: { - group: 'A', - mode: 'none', - }, - thresholdsStyle: { - mode: 'off', - }, - }, - mappings: [], - thresholds: { - mode: 'absolute', - steps: [ - { - color: 'green', - value: null, - }, - ], - }, - unit: 'none', - }, - overrides: [], - }, - options: { - legend: { - calcs: [], - displayMode: 'list', - placement: 'bottom', - showLegend: true, - }, - tooltip: { - mode: 'multi', - sort: 'desc', - }, - }, -}; - -{ - grafanaDashboards+:: { - 'bigip-virtual-server-overview.json': - dashboard.new( - 'BIG-IP virtual server overview', - time_from='%s' % $._config.dashboardPeriod, - tags=($._config.dashboardTags), - timezone='%s' % $._config.dashboardTimezone, - refresh='%s' % $._config.dashboardRefresh, - description='', - uid=dashboardUid, - ) - .addLink(grafana.link.dashboards( - asDropdown=false, - title='Other BIG-IP dashboards', - includeVars=true, - keepTime=true, - tags=($._config.dashboardTags), - )) - .addTemplates( - std.flattenArrays([ - [ - template.datasource( - promDatasourceName, - 'prometheus', - null, - label='Data Source', - refresh='load' - ), - ], - [ - template.new( - 'job', - promDatasource, - 'label_values(bigip_vs_status_availability_state,job)', - label='Job', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - template.new( - 'instance', - promDatasource, - 'label_values(bigip_vs_status_availability_state{job=~"$job"}, instance)', - label='Instance', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - template.new( - 'bigip_virtual_server', - promDatasource, - 'label_values(bigip_vs_status_availability_state{job=~"$job", instance=~"$instance"},vs)', - label='BIG-IP virtual server', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - template.new( - 'bigip_partition', - promDatasource, - 'label_values(bigip_vs_status_availability_state{job=~"$job", instance=~"$instance"},partition)', - label='BIG-IP partition', - refresh=2, - includeAll=true, - multi=true, - allValues='.+', - sort=1 - ), - ], - ]) - ) - .addPanels( - std.flattenArrays([ - [ - availabilityStatusPanel { gridPos: { h: 5, w: 8, x: 0, y: 0 } }, - requests__intervalPanel { gridPos: { h: 5, w: 8, x: 8, y: 0 } }, - averageConnectionDurationPanel { gridPos: { h: 5, w: 8, x: 16, y: 0 } }, - connectionsPanel { gridPos: { h: 5, w: 24, x: 0, y: 5 } }, - ephemeralConnectionsPanel { gridPos: { h: 5, w: 24, x: 0, y: 10 } }, - trafficInboundPanel { gridPos: { h: 5, w: 12, x: 0, y: 15 } }, - trafficOutboundPanel { gridPos: { h: 5, w: 12, x: 12, y: 15 } }, - trafficInboundEphemeralPanel { gridPos: { h: 5, w: 12, x: 0, y: 20 } }, - trafficOutboundEphemeralPanel { gridPos: { h: 5, w: 12, x: 12, y: 20 } }, - packetsInboundIntervalPanel { gridPos: { h: 5, w: 12, x: 0, y: 25 } }, - packetsOutboundIntervalPanel { gridPos: { h: 5, w: 12, x: 12, y: 25 } }, - packetsEphemeralInboundntervalPanel { gridPos: { h: 5, w: 12, x: 0, y: 30 } }, - packetsEphemeralOutboundIntervalPanel { gridPos: { h: 5, w: 12, x: 12, y: 30 } }, - ], - ]) - ), - }, -} diff --git a/f5-bigip-mixin/dashboards/dashboards.libsonnet b/f5-bigip-mixin/dashboards/dashboards.libsonnet deleted file mode 100644 index 36515fb6e..000000000 --- a/f5-bigip-mixin/dashboards/dashboards.libsonnet +++ /dev/null @@ -1,5 +0,0 @@ -(import 'bigip-cluster-overview.libsonnet') + -(import 'bigip-node-overview.libsonnet') + -(import 'bigip-pool-overview.libsonnet') + -(import 'bigip-virtual-server-overview.libsonnet') + -(import 'bigip-logs-overview.libsonnet') diff --git a/f5-bigip-mixin/dashboards_out/bigip-node-overview.json b/f5-bigip-mixin/dashboards_out/bigip-node-overview.json deleted file mode 100644 index 7bd428062..000000000 --- a/f5-bigip-mixin/dashboards_out/bigip-node-overview.json +++ /dev/null @@ -1,972 +0,0 @@ -{ - "__inputs": [ ], - "__requires": [ ], - "annotations": { - "list": [ ] - }, - "description": "", - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, - "links": [ - { - "asDropdown": false, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [ - "f5-bigip-mixin" - ], - "targetBlank": false, - "title": "Other BIG-IP dashboards", - "type": "dashboards", - "url": "" - } - ], - "panels": [ - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The availability status of the node.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "fixed" - }, - "custom": { - "align": "left", - "cellOptions": { - "type": "color-text" - }, - "inspect": false - }, - "mappings": [ - { - "options": { - "0": { - "color": "red", - "index": 1, - "text": "Unavailable" - }, - "1": { - "color": "green", - "index": 0, - "text": "Available" - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "job" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "__name__" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "partition" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "instance" - }, - "properties": [ - { - "id": "displayName", - "value": "Instance" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "node" - }, - "properties": [ - { - "id": "displayName", - "value": "Node" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value" - }, - "properties": [ - { - "id": "displayName", - "value": "Status" - } - ] - } - ] - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 0, - "y": 0 - }, - "id": 2, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": [ ], - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true - }, - "pluginVersion": "10.2.0-60139", - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "{{node}} - {{instance}}" - } - ], - "title": "Availability status", - "type": "table" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The number of requests made to the node.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 8, - "y": 0 - }, - "id": 3, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "increase(bigip_node_tot_requests{job=~\"$job\", instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{node}} - {{instance}}" - } - ], - "title": "Requests / $__interval", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The current number of active sessions to the node.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 16, - "y": 0 - }, - "id": 4, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_node_cur_sessions{job=~\"$job\", instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{node}} - {{instance}}" - } - ], - "title": "Active sessions", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The current active server-side connections to the node in comparison to the maximum connection capacity.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 24, - "x": 0, - "y": 5 - }, - "id": 5, - "options": { - "legend": { - "calcs": [ - "min", - "mean", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_node_serverside_cur_conns{job=~\"$job\", instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{node}} - {{instance}} - current" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_node_serverside_max_conns{job=~\"$job\", instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{node}} - {{instance}} - max" - } - ], - "title": "Connections", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The rate of data received from the pool by the node.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "Bps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 10 - }, - "id": 6, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "rate(bigip_node_serverside_bytes_in{job=~\"$job\", instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{node}} - {{instance}}" - } - ], - "title": "Traffic inbound", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The rate of data sent from the pool by the node.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "Bps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 10 - }, - "id": 7, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "rate(bigip_node_serverside_bytes_out{job=~\"$job\", instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{node}} - {{instance}}" - } - ], - "title": "Traffic outbound", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The number of packets received by the node from the pool.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 15 - }, - "id": 8, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "increase(bigip_node_serverside_pkts_in{job=~\"$job\", instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{node}} - {{instance}}" - } - ], - "title": "Packets inbound / $__interval", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The number of packets sent by the node from the pool.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 15 - }, - "id": 9, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "increase(bigip_node_serverside_pkts_out{job=~\"$job\", instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{node}} - {{instance}}" - } - ], - "title": "Packets outbound / $__interval", - "type": "timeseries" - } - ], - "refresh": "1m", - "rows": [ ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "f5-bigip-mixin" - ], - "templating": { - "list": [ - { - "current": { }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "Job", - "multi": true, - "name": "job", - "options": [ ], - "query": "label_values(bigip_node_status_availability_state,job)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "Instance", - "multi": true, - "name": "instance", - "options": [ ], - "query": "label_values(bigip_node_status_availability_state{job=~\"$job\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "BIG-IP node", - "multi": true, - "name": "bigip_node", - "options": [ ], - "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\"},node)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "BIG-IP partition", - "multi": true, - "name": "bigip_partition", - "options": [ ], - "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\"},partition)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-30m", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "default", - "title": "BIG-IP node overview", - "uid": "bigip-node-overview", - "version": 0 - } \ No newline at end of file diff --git a/f5-bigip-mixin/dashboards_out/bigip-pool-overview.json b/f5-bigip-mixin/dashboards_out/bigip-pool-overview.json deleted file mode 100644 index 542c8d36e..000000000 --- a/f5-bigip-mixin/dashboards_out/bigip-pool-overview.json +++ /dev/null @@ -1,1162 +0,0 @@ -{ - "__inputs": [ ], - "__requires": [ ], - "annotations": { - "list": [ ] - }, - "description": "", - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, - "links": [ - { - "asDropdown": false, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [ - "f5-bigip-mixin" - ], - "targetBlank": false, - "title": "Other BIG-IP dashboards", - "type": "dashboards", - "url": "" - } - ], - "panels": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "The availability status of the pool.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "fixed" - }, - "custom": { - "align": "left", - "cellOptions": { - "type": "color-text" - }, - "inspect": false - }, - "mappings": [ - { - "options": { - "0": { - "color": "red", - "index": 1, - "text": "Unavailable" - }, - "1": { - "color": "green", - "index": 0, - "text": "Available" - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "job" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "__name__" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "partition" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "instance" - }, - "properties": [ - { - "id": "displayName", - "value": "Instance" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "pool" - }, - "properties": [ - { - "id": "displayName", - "value": "Pool" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value" - }, - "properties": [ - { - "id": "displayName", - "value": "Status" - } - ] - } - ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 0 - }, - "id": 2, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": [ ], - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true - }, - "pluginVersion": "10.2.0-60139", - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bigip_pool_status_availability_state{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}}" - } - ], - "title": "Availability status", - "type": "table" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "The number of requests made to the pool.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 0 - }, - "id": 3, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "increase(bigip_pool_tot_requests{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}}" - } - ], - "title": "Requests / $__interval", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "The number of active and minimum required members within the pool.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 24, - "x": 0, - "y": 5 - }, - "id": 4, - "options": { - "legend": { - "calcs": [ - "min", - "mean", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bigip_pool_active_member_cnt{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}} - active" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bigip_pool_min_active_members{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}} - minimum" - } - ], - "title": "Members", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "The current and maximum number of node connections within the pool.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 5, - "options": { - "legend": { - "calcs": [ - "min", - "mean", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bigip_pool_serverside_cur_conns{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}} - current" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bigip_pool_serverside_max_conns{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}} - maximum" - } - ], - "title": "Connections", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "The depth of connection queues within the pool, including the current depth.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 15 - }, - "id": 6, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "bigip_pool_connq_depth{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}}" - } - ], - "title": "Connection queue depth", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "The number of connections that have been serviced within the pool.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 15 - }, - "id": 7, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "increase(bigip_pool_connq_serviced{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}}" - } - ], - "title": "Connection queue serviced / $__interval", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "The rate of date received from virtual servers by the pool.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "Bps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 20 - }, - "id": 8, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "rate(bigip_pool_serverside_bytes_in{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}}" - } - ], - "title": "Traffic inbound", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "The rate of date sent from virtual servers by the pool.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "Bps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 20 - }, - "id": 9, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "rate(bigip_pool_serverside_bytes_out{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}}" - } - ], - "title": "Traffic outbound", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "The number of packets received from virtual servers by the pool.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 25 - }, - "id": 10, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "increase(bigip_pool_serverside_pkts_out{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}}" - } - ], - "title": "Packets inbound / $__interval", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "description": "The number of packets sent from virtual servers by the pool.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 25 - }, - "id": 11, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${prometheus_datasource}" - }, - "expr": "increase(bigip_pool_serverside_pkts_out{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}}" - } - ], - "title": "Packets outbound / $__interval", - "type": "timeseries" - } - ], - "refresh": "1m", - "rows": [ ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "f5-bigip-mixin" - ], - "templating": { - "list": [ - { - "current": { }, - "hide": 0, - "label": "Data Source", - "name": "prometheus_datasource", - "options": [ ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${prometheus_datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "Job", - "multi": true, - "name": "job", - "options": [ ], - "query": "label_values(bigip_pool_status_availability_state,job)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${prometheus_datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "Instance", - "multi": true, - "name": "instance", - "options": [ ], - "query": "label_values(bigip_pool_status_availability_state{job=~\"$job\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${prometheus_datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "BIG-IP pool", - "multi": true, - "name": "bigip_pool", - "options": [ ], - "query": "label_values(bigip_pool_status_availability_state{job=~\"$job\", instance=~\"$instance\"},pool)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${prometheus_datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "BIG-IP partition", - "multi": true, - "name": "bigip_partition", - "options": [ ], - "query": "label_values(bigip_pool_status_availability_state{job=~\"$job\", instance=~\"$instance\"},partition)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-30m", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "default", - "title": "BIG-IP pool overview", - "uid": "bigip-pool-overview", - "version": 0 - } \ No newline at end of file diff --git a/f5-bigip-mixin/dashboards_out/bigip-virtual-server-overview.json b/f5-bigip-mixin/dashboards_out/bigip-virtual-server-overview.json deleted file mode 100644 index d7c096721..000000000 --- a/f5-bigip-mixin/dashboards_out/bigip-virtual-server-overview.json +++ /dev/null @@ -1,1445 +0,0 @@ -{ - "__inputs": [ ], - "__requires": [ ], - "annotations": { - "list": [ ] - }, - "description": "", - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, - "links": [ - { - "asDropdown": false, - "icon": "external link", - "includeVars": true, - "keepTime": true, - "tags": [ - "f5-bigip-mixin" - ], - "targetBlank": false, - "title": "Other BIG-IP dashboards", - "type": "dashboards", - "url": "" - } - ], - "panels": [ - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The availability status of the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "fixed" - }, - "custom": { - "align": "left", - "cellOptions": { - "type": "color-text" - }, - "inspect": false - }, - "mappings": [ - { - "options": { - "0": { - "color": "red", - "index": 1, - "text": "Unavailable" - }, - "1": { - "color": "green", - "index": 0, - "text": "Available" - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Time" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "job" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "__name__" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "partition" - }, - "properties": [ - { - "id": "custom.hidden", - "value": true - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "instance" - }, - "properties": [ - { - "id": "displayName", - "value": "Instance" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "vs" - }, - "properties": [ - { - "id": "displayName", - "value": "Virtual server" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Value" - }, - "properties": [ - { - "id": "displayName", - "value": "Status" - } - ] - } - ] - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 0, - "y": 0 - }, - "id": 2, - "options": { - "cellHeight": "sm", - "footer": { - "countRows": false, - "fields": [ ], - "reducer": [ - "sum" - ], - "show": false - }, - "showHeader": true - }, - "pluginVersion": "10.2.0-60139", - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_vs_status_availability_state{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}", - "format": "table", - "instant": true, - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" - } - ], - "title": "Availability status", - "type": "table" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The number of requests made to the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 8, - "y": 0 - }, - "id": 3, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "increase(bigip_vs_tot_requests{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" - } - ], - "title": "Requests / $__interval", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The average connection duration within the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "ms" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 8, - "x": 16, - "y": 0 - }, - "id": 4, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_vs_cs_mean_conn_dur{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" - } - ], - "title": "Average connection duration", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The evicted and current client-side connections within the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 24, - "x": 0, - "y": 5 - }, - "id": 5, - "options": { - "legend": { - "calcs": [ - "min", - "mean", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_vs_clientside_cur_conns{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}} - current" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_vs_clientside_max_conns{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}} - maximum" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_vs_clientside_evicted_conns{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}} - evicted" - } - ], - "title": "Connections", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The ephemeral evicted and current client-side connections within the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 24, - "x": 0, - "y": 10 - }, - "id": 6, - "options": { - "legend": { - "calcs": [ - "min", - "mean", - "max" - ], - "displayMode": "table", - "placement": "right", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_vs_ephemeral_cur_conns{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}} - current" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_vs_ephemeral_max_conns{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}} - maximum" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "bigip_vs_ephemeral_evicted_conns{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}} - evicted" - } - ], - "title": "Ephemeral connections", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The rate of data received from clients by the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "Bps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 15 - }, - "id": 7, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "rate(bigip_vs_clientside_bytes_in{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" - } - ], - "title": "Traffic inbound", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The rate of data sent from clients by the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "Bps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 15 - }, - "id": 8, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "rate(bigip_vs_clientside_bytes_out{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" - } - ], - "title": "Traffic outbound", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The rate of ephemeral data received from clients by the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "Bps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 20 - }, - "id": 9, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "rate(bigip_vs_ephemeral_bytes_in{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" - } - ], - "title": "Ephemeral traffic inbound", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The rate of ephemeral data sent from clients by the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "Bps" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 20 - }, - "id": 10, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "rate(bigip_vs_ephemeral_bytes_out{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__rate_interval])", - "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" - } - ], - "title": "Ephemeral traffic outbound", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The number of packets received by the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 25 - }, - "id": 11, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "increase(bigip_vs_clientside_pkts_in{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" - } - ], - "title": "Packets inbound / $__interval", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The number of packets sent by the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 25 - }, - "id": 12, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "increase(bigip_vs_clientside_pkts_out{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" - } - ], - "title": "Packets outbound / $__interval", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The number of ephemeral packets received by the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 0, - "y": 30 - }, - "id": 13, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "increase(bigip_vs_ephemeral_pkts_in{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" - } - ], - "title": "Ephemeral packets inbound / $__interval", - "type": "timeseries" - }, - { - "datasource": { - "uid": "${datasource}" - }, - "description": "The number of ephemeral packets sent by the virtual server.", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisCenteredZero": false, - "axisColorMode": "text", - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 30, - "gradientMode": "none", - "hideFrom": { - "legend": false, - "tooltip": false, - "viz": false - }, - "insertNulls": false, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [ ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green", - "value": null - } - ] - }, - "unit": "none" - }, - "overrides": [ ] - }, - "gridPos": { - "h": 5, - "w": 12, - "x": 12, - "y": 30 - }, - "id": 14, - "options": { - "legend": { - "calcs": [ ], - "displayMode": "list", - "placement": "bottom", - "showLegend": true - }, - "tooltip": { - "mode": "multi", - "sort": "desc" - } - }, - "targets": [ - { - "datasource": { - "uid": "${datasource}" - }, - "expr": "increase(bigip_vs_ephemeral_pkts_out{job=~\"$job\", instance=~\"$instance\", vs=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__interval:])", - "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" - } - ], - "title": "Ephemeral packets outbound / $__interval", - "type": "timeseries" - } - ], - "refresh": "1m", - "rows": [ ], - "schemaVersion": 14, - "style": "dark", - "tags": [ - "f5-bigip-mixin" - ], - "templating": { - "list": [ - { - "current": { }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ ], - "query": "prometheus", - "refresh": 1, - "regex": "", - "type": "datasource" - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "Job", - "multi": true, - "name": "job", - "options": [ ], - "query": "label_values(bigip_vs_status_availability_state,job)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "Instance", - "multi": true, - "name": "instance", - "options": [ ], - "query": "label_values(bigip_vs_status_availability_state{job=~\"$job\"}, instance)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "BIG-IP virtual server", - "multi": true, - "name": "bigip_virtual_server", - "options": [ ], - "query": "label_values(bigip_vs_status_availability_state{job=~\"$job\", instance=~\"$instance\"},vs)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - }, - { - "allValue": ".+", - "current": { }, - "datasource": { - "uid": "${datasource}" - }, - "hide": 0, - "includeAll": true, - "label": "BIG-IP partition", - "multi": true, - "name": "bigip_partition", - "options": [ ], - "query": "label_values(bigip_vs_status_availability_state{job=~\"$job\", instance=~\"$instance\"},partition)", - "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false - } - ] - }, - "time": { - "from": "now-30m", - "to": "now" - }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, - "timezone": "default", - "title": "BIG-IP virtual server overview", - "uid": "bigip-virtual-server-overview", - "version": 0 - } \ No newline at end of file diff --git a/f5-bigip-mixin/dashboards_out/bigip-cluster-overview.json b/f5-bigip-mixin/dashboards_out/f5-bigip-cluster-overview.json similarity index 53% rename from f5-bigip-mixin/dashboards_out/bigip-cluster-overview.json rename to f5-bigip-mixin/dashboards_out/f5-bigip-cluster-overview.json index 6c8762fe2..68c6fd69e 100644 --- a/f5-bigip-mixin/dashboards_out/bigip-cluster-overview.json +++ b/f5-bigip-mixin/dashboards_out/f5-bigip-cluster-overview.json @@ -1,42 +1,66 @@ { - "__inputs": [ ], - "__requires": [ ], "annotations": { "list": [ ] }, - "description": "", - "editable": false, - "gnetId": null, - "graphTooltip": 0, - "hideControls": false, - "id": null, + "description": "Overview of F5 BIG-IP cluster health and top metrics.", "links": [ { - "asDropdown": false, - "icon": "external link", + "keepTime": true, + "title": "F5 BIG-IP logs", + "type": "link", + "url": "/d/f5-bigip-logs" + }, + { + "keepTime": true, + "title": "F5 BIG-IP node overview", + "type": "link", + "url": "/d/f5-bigip-node-overview" + }, + { + "asDropdown": true, "includeVars": true, "keepTime": true, "tags": [ "f5-bigip-mixin" ], - "targetBlank": false, - "title": "Other BIG-IP dashboards", - "type": "dashboards", - "url": "" + "title": "All dashboards", + "type": "dashboards" + }, + { + "keepTime": true, + "title": "F5 BIG-IP pool overview", + "type": "link", + "url": "/d/f5-bigip-pool-overview" + }, + { + "keepTime": true, + "title": "F5 BIG-IP virtual server overview", + "type": "link", + "url": "/d/f5-bigip-virtual-server-overview" } ], "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 0 + }, + "id": 1, + "panels": [ ], + "title": "Overview", + "type": "row" + }, { "datasource": { - "uid": "${datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, "description": "The percentage of nodes available.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ ], "thresholds": { "mode": "absolute", "steps": [ @@ -59,40 +83,27 @@ ] }, "unit": "percent" - }, - "overrides": [ ] + } }, "gridPos": { "h": 5, "w": 8, "x": 0, - "y": 0 + "y": 1 }, "id": 2, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.2.0-60139", + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${datasource}" }, - "expr": "100 * sum by(partition, instance, job) (bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"}) / clamp_min(count by(partition, instance, job) (bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"}),1)", + "expr": "100 * sum by(partition, instance, job) (bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"}) / clamp_min(count by(partition, instance, job) (bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"}),1)", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{instance}}" + "instant": false, + "legendFormat": "{{instance}}", + "refId": "Node availability percentage" } ], "title": "Node availability", @@ -100,15 +111,12 @@ }, { "datasource": { - "uid": "${datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, "description": "The percentage of pools available.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ ], "thresholds": { "mode": "absolute", "steps": [ @@ -131,40 +139,27 @@ ] }, "unit": "percent" - }, - "overrides": [ ] + } }, "gridPos": { "h": 5, "w": 8, "x": 8, - "y": 0 + "y": 1 }, "id": 3, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.2.0-60139", + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${datasource}" }, - "expr": "100 * sum by(partition, instance, job) (bigip_pool_status_availability_state{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"}) / clamp_min(count by(partition, instance, job) (bigip_pool_status_availability_state{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"}),1)", + "expr": "100 * sum by(partition, instance, job) (bigip_pool_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"}) / clamp_min(count by(partition, instance, job) (bigip_pool_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"}),1)", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{instance}}" + "instant": false, + "legendFormat": "{{instance}}", + "refId": "Pool availability percentage" } ], "title": "Pool availability", @@ -172,15 +167,12 @@ }, { "datasource": { - "uid": "${datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, "description": "The percentage of virtual servers available.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ ], "thresholds": { "mode": "absolute", "steps": [ @@ -203,40 +195,27 @@ ] }, "unit": "percent" - }, - "overrides": [ ] + } }, "gridPos": { "h": 5, "w": 8, "x": 16, - "y": 0 + "y": 1 }, "id": 4, - "options": { - "minVizHeight": 75, - "minVizWidth": 75, - "orientation": "auto", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showThresholdLabels": false, - "showThresholdMarkers": true - }, - "pluginVersion": "10.2.0-60139", + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${datasource}" }, - "expr": "100 * sum by(partition, instance, job) (bigip_vs_status_availability_state{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"}) / clamp_min(count by(partition, instance, job) (bigip_vs_status_availability_state{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"}),1)", + "expr": "100 * sum by(partition, instance, job) (bigip_vs_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"}) / clamp_min(count by(partition, instance, job) (bigip_vs_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"}),1)", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{instance}}" + "instant": false, + "legendFormat": "{{instance}}", + "refId": "Virtual server availability percentage" } ], "title": "Virtual server availability", @@ -244,80 +223,62 @@ }, { "datasource": { - "uid": "${datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, - "description": "Nodes with the highest number of active server-side connections.", + "description": "Nodes with the highest number of active serverside connections.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ ], "min": 0, "thresholds": { - "mode": "absolute", "steps": [ { "color": "green", "value": null } ] - }, - "unit": "none" - }, - "overrides": [ ] + } + } }, "gridPos": { "h": 5, "w": 12, "x": 0, - "y": 5 + "y": 6 }, "id": 5, "options": { "displayMode": "gradient", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "valueMode": "color" + "showUnfilled": true }, - "pluginVersion": "10.2.0-60139", + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${datasource}" }, - "expr": "topk($k, bigip_node_serverside_cur_conns{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"})", + "expr": "topk($k, bigip_node_serverside_cur_conns{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"})", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{node}} - {{instance}}" + "instant": false, + "legendFormat": "{{node}} - {{instance}}", + "refId": "Top active serverside nodes" } ], - "title": "Top active server-side nodes", + "title": "Top active serverside nodes", "type": "bargauge" }, { "datasource": { - "uid": "${datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, "description": "Nodes with the highest outbound traffic.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ ], "min": 0, "thresholds": { - "mode": "absolute", "steps": [ { "color": "green", @@ -326,42 +287,33 @@ ] }, "unit": "decbytes" - }, - "overrides": [ ] + } }, "gridPos": { "h": 5, "w": 12, "x": 12, - "y": 5 + "y": 6 }, "id": 6, "options": { "displayMode": "gradient", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "valueMode": "color" + "showUnfilled": true }, - "pluginVersion": "10.2.0-60139", + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${datasource}" }, - "expr": "topk($k, increase(bigip_node_serverside_bytes_out{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"}[$__interval:]))", + "expr": "topk($k, increase(bigip_node_serverside_bytes_out{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"}[$__interval:]))", "format": "time_series", + "instant": false, "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{node}} - {{instance}}" + "legendFormat": "{{node}} - {{instance}}", + "refId": "Top outbound traffic nodes" } ], "title": "Top outbound traffic nodes / $__interval", @@ -369,61 +321,47 @@ }, { "datasource": { - "uid": "${datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, "description": "Pools with the highest number of active members.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ ], "min": 0, "thresholds": { - "mode": "absolute", "steps": [ { "color": "green", "value": null } ] - }, - "unit": "none" - }, - "overrides": [ ] + } + } }, "gridPos": { "h": 5, "w": 8, "x": 0, - "y": 10 + "y": 11 }, "id": 7, "options": { "displayMode": "gradient", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "valueMode": "color" + "showUnfilled": true }, - "pluginVersion": "10.2.0-60139", + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${datasource}" }, - "expr": "topk($k, bigip_pool_active_member_cnt{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"})", + "expr": "topk($k, bigip_pool_active_member_cnt{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"})", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}}" + "instant": false, + "legendFormat": "{{pool}} - {{instance}}", + "refId": "Top active members in pools" } ], "title": "Top active members in pools", @@ -431,62 +369,48 @@ }, { "datasource": { - "uid": "${datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, "description": "Pools with the highest number of requests.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ ], "min": 0, "thresholds": { - "mode": "absolute", "steps": [ { "color": "green", "value": null } ] - }, - "unit": "none" - }, - "overrides": [ ] + } + } }, "gridPos": { "h": 5, "w": 8, "x": 8, - "y": 10 + "y": 11 }, "id": 8, "options": { "displayMode": "gradient", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "valueMode": "color" + "showUnfilled": true }, - "pluginVersion": "10.2.0-60139", + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${datasource}" }, - "expr": "topk($k, increase(bigip_pool_tot_requests{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"}[$__interval:]))", + "expr": "topk($k, increase(bigip_pool_tot_requests{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"}[$__interval:]))", "format": "time_series", + "instant": false, "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}}" + "legendFormat": "{{pool}} - {{instance}}", + "refId": "Top requested pools" } ], "title": "Top requested pools / $__interval", @@ -494,143 +418,110 @@ }, { "datasource": { - "uid": "${datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, - "description": "Pools with the largest connection queues.", + "description": "Pools with the highest connection queue depth.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ ], "min": 0, "thresholds": { - "mode": "absolute", "steps": [ { "color": "green", "value": null } ] - }, - "unit": "none" - }, - "overrides": [ ] + } + } }, "gridPos": { "h": 5, "w": 8, "x": 16, - "y": 9 + "y": 11 }, "id": 9, "options": { "displayMode": "gradient", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "valueMode": "color" + "showUnfilled": true }, - "pluginVersion": "10.2.0-60139", + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${datasource}" }, - "expr": "topk($k, bigip_pool_connq_depth{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"})", + "expr": "topk($k, bigip_pool_connq_depth{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"})", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{pool}} - {{instance}}" + "instant": false, + "legendFormat": "{{pool}} - {{instance}}", + "refId": "Top queue depth" } ], - "title": "Top queue depth", + "title": "Top queue depth pools", "type": "bargauge" }, { "datasource": { - "uid": "${datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, - "description": "Virtual servers with the highest traffic (inbound and outbound).", + "description": "Virtual servers with the highest number of current clientside connections.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ ], "min": 0, "thresholds": { - "mode": "absolute", "steps": [ { "color": "green", "value": null } ] - }, - "unit": "decbytes" - }, - "overrides": [ ] + } + } }, "gridPos": { "h": 5, "w": 12, "x": 0, - "y": 15 + "y": 16 }, "id": 10, "options": { "displayMode": "gradient", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "valueMode": "color" + "showUnfilled": true }, - "pluginVersion": "10.2.0-60139", + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${datasource}" }, - "expr": "topk($k, increase(bigip_vs_clientside_bytes_in{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"}[$__interval:])) + topk(5, increase(bigip_vs_clientside_bytes_out{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"}[$__interval:]))", + "expr": "topk($k, bigip_vs_clientside_cur_conns{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"})", "format": "time_series", - "interval": "1m", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" + "instant": false, + "legendFormat": "{{virtual_server}} - {{instance}}", + "refId": "Top utilized virtual servers" } ], - "title": "Top utilized virtual servers / $__interval", + "title": "Top utilized virtual servers", "type": "bargauge" }, { "datasource": { - "uid": "${datasource}" + "type": "datasource", + "uid": "-- Mixed --" }, - "description": "Virtual servers with the highest response times.", + "description": "Virtual servers with the highest mean connection duration.", "fieldConfig": { "defaults": { - "color": { - "mode": "thresholds" - }, - "mappings": [ ], "min": 0, "thresholds": { - "mode": "absolute", "steps": [ { "color": "green", @@ -639,41 +530,32 @@ ] }, "unit": "ms" - }, - "overrides": [ ] + } }, "gridPos": { "h": 5, "w": 12, "x": 12, - "y": 15 + "y": 16 }, "id": 11, "options": { "displayMode": "gradient", - "minVizHeight": 10, - "minVizWidth": 0, "orientation": "horizontal", - "reduceOptions": { - "calcs": [ - "lastNotNull" - ], - "fields": "", - "values": false - }, - "showUnfilled": true, - "valueMode": "color" + "showUnfilled": true }, - "pluginVersion": "10.2.0-60139", + "pluginVersion": "v11.0.0", "targets": [ { "datasource": { + "type": "prometheus", "uid": "${datasource}" }, - "expr": "topk($k, bigip_vs_cs_mean_conn_dur{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"})", + "expr": "topk($k, bigip_vs_cs_mean_conn_dur{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", partition=~\"$bigip_partition\"})", "format": "time_series", - "intervalFactor": 2, - "legendFormat": "{{vs}} - {{instance}}" + "instant": false, + "legendFormat": "{{virtual_server}} - {{instance}}", + "refId": "Top latency virtual servers" } ], "title": "Top latency virtual servers", @@ -681,123 +563,103 @@ } ], "refresh": "1m", - "rows": [ ], - "schemaVersion": 14, - "style": "dark", + "schemaVersion": 39, "tags": [ "f5-bigip-mixin" ], "templating": { "list": [ { - "current": { }, - "hide": 0, - "label": "Data Source", - "name": "datasource", - "options": [ ], + "label": "Prometheus data source", + "name": "prometheus_datasource", "query": "prometheus", - "refresh": 1, "regex": "", "type": "datasource" }, { "allValue": ".+", - "current": { }, "datasource": { - "uid": "${datasource}" + "type": "prometheus", + "uid": "${prometheus_datasource}" }, - "hide": 0, "includeAll": true, "label": "Job", "multi": true, "name": "job", - "options": [ ], - "query": "label_values(bigip_node_status_availability_state,job)", + "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\"}, job)", "refresh": 2, - "regex": "", "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false + "type": "query" }, { "allValue": ".+", - "current": { }, "datasource": { - "uid": "${datasource}" + "type": "prometheus", + "uid": "${prometheus_datasource}" }, - "hide": 0, "includeAll": true, "label": "Instance", "multi": true, "name": "instance", - "options": [ ], - "query": "label_values(bigip_node_status_availability_state{job=~\"$job\"}, instance)", + "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\"}, instance)", "refresh": 2, - "regex": "", "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false + "type": "query" + }, + { + "hide": 2, + "label": "Loki data source", + "name": "loki_datasource", + "query": "loki", + "regex": "", + "type": "datasource" }, { - "allValue": "", "current": { + "selected": false, "text": "5", "value": "5" }, - "hide": 0, - "includeAll": false, "label": "Top node count", - "multi": false, "name": "k", "options": [ { + "selected": true, "text": "5", "value": "5" }, { + "selected": false, "text": "10", "value": "10" }, { + "selected": false, "text": "20", "value": "20" }, { + "selected": false, "text": "50", "value": "50" } ], - "query": "5,10,20,50", - "refresh": 0, + "query": "5 : 5,10 : 10,20 : 20,50 : 50", "type": "custom" }, { "allValue": ".+", - "current": { }, "datasource": { - "uid": "${datasource}" + "type": "prometheus", + "uid": "${prometheus_datasource}" }, - "hide": 0, "includeAll": true, "label": "BIG-IP partition", "multi": true, "name": "bigip_partition", - "options": [ ], - "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"},partition)", + "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\", partition=~\"$bigip_partition\"}, partition)", "refresh": 2, - "regex": "", - "sort": 1, - "tagValuesQuery": "", - "tags": [ ], - "tagsQuery": "", - "type": "query", - "useTags": false + "type": "query" } ] }, @@ -805,33 +667,7 @@ "from": "now-30m", "to": "now" }, - "timepicker": { - "refresh_intervals": [ - "5s", - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ], - "time_options": [ - "5m", - "15m", - "1h", - "6h", - "12h", - "24h", - "2d", - "7d", - "30d" - ] - }, "timezone": "default", - "title": "BIG-IP cluster overview", - "uid": "bigip-cluster-overview", - "version": 0 + "title": "F5 BIG-IP cluster overview", + "uid": "f5-bigip-cluster-overview" } \ No newline at end of file diff --git a/f5-bigip-mixin/dashboards_out/f5-bigip-logs.json b/f5-bigip-mixin/dashboards_out/f5-bigip-logs.json new file mode 100644 index 000000000..ddbd0f8bb --- /dev/null +++ b/f5-bigip-mixin/dashboards_out/f5-bigip-logs.json @@ -0,0 +1,338 @@ +{ + "links": [ + { + "keepTime": true, + "title": "F5 BIG-IP cluster overview", + "type": "link", + "url": "/d/f5-bigip-cluster-overview" + }, + { + "keepTime": true, + "title": "F5 BIG-IP node overview", + "type": "link", + "url": "/d/f5-bigip-node-overview" + }, + { + "asDropdown": true, + "includeVars": true, + "keepTime": true, + "tags": [ + "f5-bigip-mixin" + ], + "title": "All dashboards", + "type": "dashboards" + }, + { + "keepTime": true, + "title": "F5 BIG-IP pool overview", + "type": "link", + "url": "/d/f5-bigip-pool-overview" + }, + { + "keepTime": true, + "title": "F5 BIG-IP virtual server overview", + "type": "link", + "url": "/d/f5-bigip-virtual-server-overview" + } + ], + "options": { + "showTime": false + }, + "panels": [ + { + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "description": "Logs volume grouped by \"level\" label.", + "fieldConfig": { + "defaults": { + "custom": { + "drawStyle": "bars", + "fillOpacity": 50, + "stacking": { + "mode": "normal" + } + }, + "unit": "none" + }, + "overrides": [ + { + "matcher": { + "id": "byRegexp", + "options": "(E|e)merg|(F|f)atal|(A|a)lert|(C|c)rit.*" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "purple", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "(E|e)(rr.*|RR.*)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "(W|w)(arn.*|ARN.*|rn|RN)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "(N|n)(otice|ote)|(I|i)(nf.*|NF.*)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "green", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "dbg.*|DBG.*|(D|d)(EBUG|ebug)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "(T|t)(race|RACE)" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "light-blue", + "mode": "fixed" + } + } + ] + }, + { + "matcher": { + "id": "byRegexp", + "options": "logs" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "text", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 1, + "maxDataPoints": 100, + "options": { + "tooltip": { + "mode": "multi", + "sort": "desc" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "expr": "sum by (level) (count_over_time({job=~\"syslog\",job=~\"$job\",host=~\"$host\",syslog_facility=~\"$syslog_facility\",level=~\"$level\"}\n|~ \"$regex_search\"\n\n[$__auto]))\n", + "legendFormat": "{{ level }}" + } + ], + "title": "Logs volume", + "transformations": [ + { + "id": "renameByRegex", + "options": { + "regex": "Value", + "renamePattern": "logs" + } + } + ], + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "gridPos": { + "h": 18, + "w": 24, + "x": 0, + "y": 18 + }, + "id": 2, + "options": { + "dedupStrategy": "exact", + "enableLogDetails": true, + "prettifyLogMessage": true, + "showTime": true, + "wrapLogMessage": true + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "expr": "{job=~\"syslog\",job=~\"$job\",host=~\"$host\",syslog_facility=~\"$syslog_facility\",level=~\"$level\"} \n|~ \"$regex_search\"\n\n\n" + } + ], + "title": "Logs", + "type": "logs" + } + ], + "refresh": "1m", + "schemaVersion": 39, + "tags": [ + "f5-bigip-mixin" + ], + "templating": { + "list": [ + { + "label": "Loki data source", + "name": "loki_datasource", + "query": "loki", + "regex": "", + "type": "datasource" + }, + { + "allValue": ".*", + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "includeAll": true, + "label": "Job", + "multi": true, + "name": "job", + "query": "label_values({job=~\"syslog\"}, job)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "includeAll": true, + "label": "Host", + "multi": true, + "name": "host", + "query": "label_values({job=~\"syslog\",job=~\"$job\"}, host)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "includeAll": true, + "label": "Syslog_facility", + "multi": true, + "name": "syslog_facility", + "query": "label_values({job=~\"syslog\",job=~\"$job\",host=~\"$host\"}, syslog_facility)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "datasource": { + "type": "loki", + "uid": "${loki_datasource}" + }, + "includeAll": true, + "label": "Level", + "multi": true, + "name": "level", + "query": "label_values({job=~\"syslog\",job=~\"$job\",host=~\"$host\",syslog_facility=~\"$syslog_facility\"}, level)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "", + "value": "" + }, + "label": "Regex search", + "name": "regex_search", + "options": [ + { + "selected": true, + "text": "", + "value": "" + } + ], + "query": "", + "type": "textbox" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timezone": "utc", + "title": "F5 BIG-IP logs", + "uid": "f5-bigip-logs" + } \ No newline at end of file diff --git a/f5-bigip-mixin/dashboards_out/f5-bigip-node-overview.json b/f5-bigip-mixin/dashboards_out/f5-bigip-node-overview.json new file mode 100644 index 000000000..1a60021c0 --- /dev/null +++ b/f5-bigip-mixin/dashboards_out/f5-bigip-node-overview.json @@ -0,0 +1,554 @@ +{ + "annotations": { + "list": [ ] + }, + "description": "Detailed view of F5 BIG-IP node metrics and status.", + "links": [ + { + "keepTime": true, + "title": "F5 BIG-IP cluster overview", + "type": "link", + "url": "/d/f5-bigip-cluster-overview" + }, + { + "keepTime": true, + "title": "F5 BIG-IP logs", + "type": "link", + "url": "/d/f5-bigip-logs" + }, + { + "asDropdown": true, + "includeVars": true, + "keepTime": true, + "tags": [ + "f5-bigip-mixin" + ], + "title": "All dashboards", + "type": "dashboards" + }, + { + "keepTime": true, + "title": "F5 BIG-IP pool overview", + "type": "link", + "url": "/d/f5-bigip-pool-overview" + }, + { + "keepTime": true, + "title": "F5 BIG-IP virtual server overview", + "type": "link", + "url": "/d/f5-bigip-virtual-server-overview" + } + ], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 0 + }, + "id": 1, + "panels": [ ], + "title": "Status", + "type": "row" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The availability status of the node.", + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "0": { + "color": "red", + "index": 1, + "text": "Unavailable" + }, + "1": { + "color": "green", + "index": 0, + "text": "Available" + } + }, + "type": "value" + } + ] + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "job" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "__name__" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "partition" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "instance" + }, + "properties": [ + { + "id": "displayName", + "value": "Instance" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "node" + }, + "properties": [ + { + "id": "displayName", + "value": "Node" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value" + }, + "properties": [ + { + "id": "displayName", + "value": "Status" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 2, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}\n)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "{{node}} - {{instance}}", + "refId": "Node availability status" + } + ], + "title": "Availability status", + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 10 + }, + "id": 3, + "panels": [ ], + "title": "Metrics", + "type": "row" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of current sessions on the node.", + "fieldConfig": { + "defaults": { + "unit": "short" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 11 + }, + "id": 4, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_node_cur_sessions{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}\n)", + "format": "time_series", + "instant": false, + "legendFormat": "{{node}} - {{instance}}", + "refId": "Current sessions" + } + ], + "title": "Current sessions", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of requests made to the node.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30 + } + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 11 + }, + "id": 5, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n rate(bigip_node_tot_requests{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}[$__rate_interval])\n)", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "{{node}} - {{instance}}", + "refId": "Total requests" + } + ], + "title": "Requests / $__interval", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of bytes received on the serverside.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30 + }, + "unit": "bytes" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 6, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n rate(bigip_node_serverside_bytes_in{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}[$__rate_interval])\n)", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "{{node}} - {{instance}}", + "refId": "Serverside bytes in" + } + ], + "title": "Serverside bytes in / $__interval", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of bytes sent on the serverside.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30 + }, + "unit": "bytes" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 19 + }, + "id": 7, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n rate(bigip_node_serverside_bytes_out{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}[$__rate_interval])\n)", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "{{node}} - {{instance}}", + "refId": "Serverside bytes out" + } + ], + "title": "Serverside bytes out / $__interval", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of current serverside connections on the node.", + "fieldConfig": { + "defaults": { + "unit": "short" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 27 + }, + "id": 8, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_node_serverside_cur_conns{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}\n)", + "format": "time_series", + "instant": false, + "legendFormat": "{{node}} - {{instance}}", + "refId": "Serverside current connections" + } + ], + "title": "Serverside current connections", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The maximum number of serverside connections on the node.", + "fieldConfig": { + "defaults": { + "unit": "short" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 27 + }, + "id": 9, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_node_serverside_max_conns{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", node=~\"$bigip_node\", partition=~\"$bigip_partition\"}\n)", + "format": "time_series", + "instant": false, + "legendFormat": "{{node}} - {{instance}}", + "refId": "Serverside max connections" + } + ], + "title": "Serverside max connections", + "type": "timeseries" + } + ], + "refresh": "1m", + "schemaVersion": 39, + "tags": [ + "f5-bigip-mixin" + ], + "templating": { + "list": [ + { + "label": "Prometheus data source", + "name": "prometheus_datasource", + "query": "prometheus", + "regex": "", + "type": "datasource" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "Job", + "multi": true, + "name": "job", + "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\"}, job)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "Instance", + "multi": true, + "name": "instance", + "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\"}, instance)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "hide": 2, + "label": "Loki data source", + "name": "loki_datasource", + "query": "loki", + "regex": "", + "type": "datasource" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "BIG-IP node", + "multi": true, + "name": "bigip_node", + "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\"}, node)", + "refresh": 2, + "type": "query" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "BIG-IP partition", + "multi": true, + "name": "bigip_partition", + "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\", node=~\"$bigip_node\"}, partition)", + "refresh": 2, + "type": "query" + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timezone": "default", + "title": "F5 BIG-IP node overview", + "uid": "f5-bigip-node-overview" + } \ No newline at end of file diff --git a/f5-bigip-mixin/dashboards_out/f5-bigip-pool-overview.json b/f5-bigip-mixin/dashboards_out/f5-bigip-pool-overview.json new file mode 100644 index 000000000..752a8e5cc --- /dev/null +++ b/f5-bigip-mixin/dashboards_out/f5-bigip-pool-overview.json @@ -0,0 +1,549 @@ +{ + "annotations": { + "list": [ ] + }, + "description": "Detailed view of F5 BIG-IP pool metrics and status.", + "links": [ + { + "keepTime": true, + "title": "F5 BIG-IP cluster overview", + "type": "link", + "url": "/d/f5-bigip-cluster-overview" + }, + { + "keepTime": true, + "title": "F5 BIG-IP logs", + "type": "link", + "url": "/d/f5-bigip-logs" + }, + { + "keepTime": true, + "title": "F5 BIG-IP node overview", + "type": "link", + "url": "/d/f5-bigip-node-overview" + }, + { + "asDropdown": true, + "includeVars": true, + "keepTime": true, + "tags": [ + "f5-bigip-mixin" + ], + "title": "All dashboards", + "type": "dashboards" + }, + { + "keepTime": true, + "title": "F5 BIG-IP virtual server overview", + "type": "link", + "url": "/d/f5-bigip-virtual-server-overview" + } + ], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 0 + }, + "id": 1, + "panels": [ ], + "title": "Status", + "type": "row" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The availability status of the pool.", + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "0": { + "color": "red", + "index": 1, + "text": "Unavailable" + }, + "1": { + "color": "green", + "index": 0, + "text": "Available" + } + }, + "type": "value" + } + ] + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "job" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "__name__" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "partition" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "instance" + }, + "properties": [ + { + "id": "displayName", + "value": "Instance" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "pool" + }, + "properties": [ + { + "id": "displayName", + "value": "Pool" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value" + }, + "properties": [ + { + "id": "displayName", + "value": "Status" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 2, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_pool_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}\n)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "{{pool}} - {{instance}}", + "refId": "Pool availability status" + } + ], + "title": "Availability status", + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 10 + }, + "id": 3, + "panels": [ ], + "title": "Metrics", + "type": "row" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of active members in the pool.", + "fieldConfig": { + "defaults": { + "unit": "short" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 11 + }, + "id": 4, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_pool_active_member_cnt{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}\n)", + "format": "time_series", + "instant": false, + "legendFormat": "{{pool}} - {{instance}}", + "refId": "Active member count" + } + ], + "title": "Active member count", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The depth of the connection queue.", + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 11 + }, + "id": 5, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_pool_connq_depth{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}\n)", + "format": "time_series", + "instant": false, + "legendFormat": "{{pool}} - {{instance}}", + "refId": "Connection queue depth" + } + ], + "title": "Connection queue depth", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of requests made to the pool.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30 + } + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 6, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n rate(bigip_pool_tot_requests{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}[$__rate_interval])\n)", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "{{pool}} - {{instance}}", + "refId": "Total requests" + } + ], + "title": "Requests / $__interval", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of bytes received on the serverside.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30 + }, + "unit": "bytes" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 19 + }, + "id": 7, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n rate(bigip_pool_serverside_bytes_in{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}[$__rate_interval])\n)", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "{{pool}} - {{instance}}", + "refId": "Serverside bytes in" + } + ], + "title": "Serverside bytes in / $__interval", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of bytes sent on the serverside.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30 + }, + "unit": "bytes" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 27 + }, + "id": 8, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n rate(bigip_pool_serverside_bytes_out{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}[$__rate_interval])\n)", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "{{pool}} - {{instance}}", + "refId": "Serverside bytes out" + } + ], + "title": "Serverside bytes out / $__interval", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of current serverside connections on the pool.", + "fieldConfig": { + "defaults": { + "unit": "short" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 27 + }, + "id": 9, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_pool_serverside_cur_conns{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", pool=~\"$bigip_pool\", partition=~\"$bigip_partition\"}\n)", + "format": "time_series", + "instant": false, + "legendFormat": "{{pool}} - {{instance}}", + "refId": "Serverside current connections" + } + ], + "title": "Serverside current connections", + "type": "timeseries" + } + ], + "refresh": "1m", + "schemaVersion": 39, + "tags": [ + "f5-bigip-mixin" + ], + "templating": { + "list": [ + { + "label": "Prometheus data source", + "name": "prometheus_datasource", + "query": "prometheus", + "regex": "", + "type": "datasource" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "Job", + "multi": true, + "name": "job", + "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\"}, job)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "Instance", + "multi": true, + "name": "instance", + "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\"}, instance)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "hide": 2, + "label": "Loki data source", + "name": "loki_datasource", + "query": "loki", + "regex": "", + "type": "datasource" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "BIG-IP pool", + "multi": true, + "name": "bigip_pool", + "query": "label_values(bigip_pool_status_availability_state{job=~\"$job\", instance=~\"$instance\"}, pool)", + "refresh": 2, + "type": "query" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "BIG-IP partition", + "multi": true, + "name": "bigip_partition", + "query": "label_values(bigip_pool_status_availability_state{job=~\"$job\", instance=~\"$instance\", pool=~\"$bigip_pool\"}, partition)", + "refresh": 2, + "type": "query" + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timezone": "default", + "title": "F5 BIG-IP pool overview", + "uid": "f5-bigip-pool-overview" + } \ No newline at end of file diff --git a/f5-bigip-mixin/dashboards_out/f5-bigip-virtual-server-overview.json b/f5-bigip-mixin/dashboards_out/f5-bigip-virtual-server-overview.json new file mode 100644 index 000000000..ba28285e1 --- /dev/null +++ b/f5-bigip-mixin/dashboards_out/f5-bigip-virtual-server-overview.json @@ -0,0 +1,657 @@ +{ + "annotations": { + "list": [ ] + }, + "description": "Detailed view of F5 BIG-IP virtual server metrics and status.", + "links": [ + { + "keepTime": true, + "title": "F5 BIG-IP cluster overview", + "type": "link", + "url": "/d/f5-bigip-cluster-overview" + }, + { + "keepTime": true, + "title": "F5 BIG-IP logs", + "type": "link", + "url": "/d/f5-bigip-logs" + }, + { + "keepTime": true, + "title": "F5 BIG-IP node overview", + "type": "link", + "url": "/d/f5-bigip-node-overview" + }, + { + "asDropdown": true, + "includeVars": true, + "keepTime": true, + "tags": [ + "f5-bigip-mixin" + ], + "title": "All dashboards", + "type": "dashboards" + }, + { + "keepTime": true, + "title": "F5 BIG-IP pool overview", + "type": "link", + "url": "/d/f5-bigip-pool-overview" + } + ], + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 0 + }, + "id": 1, + "panels": [ ], + "title": "Status", + "type": "row" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The availability status of the virtual server.", + "fieldConfig": { + "defaults": { + "mappings": [ + { + "options": { + "0": { + "color": "red", + "index": 1, + "text": "Unavailable" + }, + "1": { + "color": "green", + "index": 0, + "text": "Available" + } + }, + "type": "value" + } + ] + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "job" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "__name__" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "partition" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "instance" + }, + "properties": [ + { + "id": "displayName", + "value": "Instance" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "virtual_server" + }, + "properties": [ + { + "id": "displayName", + "value": "Virtual Server" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Value" + }, + "properties": [ + { + "id": "displayName", + "value": "Status" + } + ] + } + ] + }, + "gridPos": { + "h": 9, + "w": 24, + "x": 0, + "y": 1 + }, + "id": 2, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_vs_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", virtual_server=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}\n)", + "format": "table", + "instant": true, + "intervalFactor": 2, + "legendFormat": "{{virtual_server}} - {{instance}}", + "refId": "Virtual server availability status" + } + ], + "title": "Availability status", + "type": "table" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 10 + }, + "id": 3, + "panels": [ ], + "title": "Clientside Metrics", + "type": "row" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of current clientside connections on the virtual server.", + "fieldConfig": { + "defaults": { + "unit": "short" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 11 + }, + "id": 4, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_vs_clientside_cur_conns{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", virtual_server=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}\n)", + "format": "time_series", + "instant": false, + "legendFormat": "{{virtual_server}} - {{instance}}", + "refId": "Clientside current connections" + } + ], + "title": "Clientside current connections", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of requests made to the virtual server.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30 + } + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 11 + }, + "id": 5, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n rate(bigip_vs_tot_requests{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", virtual_server=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__rate_interval])\n)", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "{{virtual_server}} - {{instance}}", + "refId": "Total requests" + } + ], + "title": "Requests / $__interval", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of bytes received on the clientside.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30 + }, + "unit": "bytes" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 19 + }, + "id": 6, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n rate(bigip_vs_clientside_bytes_in{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", virtual_server=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__rate_interval])\n)", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "{{virtual_server}} - {{instance}}", + "refId": "Clientside bytes in" + } + ], + "title": "Clientside bytes in / $__interval", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of bytes sent on the clientside.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30 + }, + "unit": "bytes" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 19 + }, + "id": 7, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n rate(bigip_vs_clientside_bytes_out{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", virtual_server=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__rate_interval])\n)", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "{{virtual_server}} - {{instance}}", + "refId": "Clientside bytes out" + } + ], + "title": "Clientside bytes out / $__interval", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The mean connection duration on the virtual server.", + "fieldConfig": { + "defaults": { + "unit": "ms" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 27 + }, + "id": 8, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_vs_cs_mean_conn_dur{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", virtual_server=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}\n)", + "format": "time_series", + "instant": false, + "legendFormat": "{{virtual_server}} - {{instance}}", + "refId": "Mean connection duration" + } + ], + "title": "Mean connection duration", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 0, + "x": 0, + "y": 35 + }, + "id": 9, + "panels": [ ], + "title": "Ephemeral Metrics", + "type": "row" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of current ephemeral connections on the virtual server.", + "fieldConfig": { + "defaults": { + "unit": "short" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 36 + }, + "id": 10, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n bigip_vs_ephemeral_cur_conns{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", virtual_server=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}\n)", + "format": "time_series", + "instant": false, + "legendFormat": "{{virtual_server}} - {{instance}}", + "refId": "Ephemeral current connections" + } + ], + "title": "Ephemeral current connections", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of ephemeral bytes received.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30 + }, + "unit": "bytes" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 36 + }, + "id": 11, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n rate(bigip_vs_ephemeral_bytes_in{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", virtual_server=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__rate_interval])\n)", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "{{virtual_server}} - {{instance}}", + "refId": "Ephemeral bytes in" + } + ], + "title": "Ephemeral bytes in / $__interval", + "type": "timeseries" + }, + { + "datasource": { + "type": "datasource", + "uid": "-- Mixed --" + }, + "description": "The number of ephemeral bytes sent.", + "fieldConfig": { + "defaults": { + "custom": { + "fillOpacity": 30 + }, + "unit": "bytes" + } + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 44 + }, + "id": 12, + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom" + } + }, + "pluginVersion": "v11.0.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "${datasource}" + }, + "expr": "avg by (job,instance) (\n rate(bigip_vs_ephemeral_bytes_out{job=~\"$job\", instance=~\"$instance\",job=~\"$job\",instance=~\"$instance\", virtual_server=~\"$bigip_virtual_server\", partition=~\"$bigip_partition\"}[$__rate_interval])\n)", + "format": "time_series", + "instant": false, + "interval": "1m", + "legendFormat": "{{virtual_server}} - {{instance}}", + "refId": "Ephemeral bytes out" + } + ], + "title": "Ephemeral bytes out / $__interval", + "type": "timeseries" + } + ], + "refresh": "1m", + "schemaVersion": 39, + "tags": [ + "f5-bigip-mixin" + ], + "templating": { + "list": [ + { + "label": "Prometheus data source", + "name": "prometheus_datasource", + "query": "prometheus", + "regex": "", + "type": "datasource" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "Job", + "multi": true, + "name": "job", + "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\"}, job)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "Instance", + "multi": true, + "name": "instance", + "query": "label_values(bigip_node_status_availability_state{job=~\"$job\", instance=~\"$instance\",job=~\"$job\"}, instance)", + "refresh": 2, + "sort": 1, + "type": "query" + }, + { + "hide": 2, + "label": "Loki data source", + "name": "loki_datasource", + "query": "loki", + "regex": "", + "type": "datasource" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "BIG-IP virtual server", + "multi": true, + "name": "bigip_virtual_server", + "query": "label_values(bigip_vs_status_availability_state{job=~\"$job\", instance=~\"$instance\"}, virtual_server)", + "refresh": 2, + "type": "query" + }, + { + "allValue": ".+", + "datasource": { + "type": "prometheus", + "uid": "${prometheus_datasource}" + }, + "includeAll": true, + "label": "BIG-IP partition", + "multi": true, + "name": "bigip_partition", + "query": "label_values(bigip_vs_status_availability_state{job=~\"$job\", instance=~\"$instance\", virtual_server=~\"$bigip_virtual_server\"}, partition)", + "refresh": 2, + "type": "query" + } + ] + }, + "time": { + "from": "now-30m", + "to": "now" + }, + "timezone": "default", + "title": "F5 BIG-IP virtual server overview", + "uid": "f5-bigip-virtual-server-overview" + } \ No newline at end of file diff --git a/f5-bigip-mixin/g.libsonnet b/f5-bigip-mixin/g.libsonnet new file mode 100644 index 000000000..ee0ee23c2 --- /dev/null +++ b/f5-bigip-mixin/g.libsonnet @@ -0,0 +1,3 @@ +// grafonnet must be imported with "g" alias +local g = import 'github.com/grafana/grafonnet/gen/grafonnet-v11.0.0/main.libsonnet'; +g diff --git a/f5-bigip-mixin/jsonnetfile.json b/f5-bigip-mixin/jsonnetfile.json index 83a4fe35b..cd4c0af70 100644 --- a/f5-bigip-mixin/jsonnetfile.json +++ b/f5-bigip-mixin/jsonnetfile.json @@ -4,20 +4,20 @@ { "source": { "git": { - "remote": "https://github.com/grafana/grafonnet-lib.git", - "subdir": "grafonnet" + "remote": "https://github.com/grafana/grafonnet", + "subdir": "gen/grafonnet-v11.0.0" } }, - "version": "master" + "version": "main" }, { "source": { "git": { - "remote": "https://github.com/grafana/grafonnet.git", - "subdir": "gen/grafonnet-latest" + "remote": "https://github.com/grafana/jsonnet-libs.git", + "subdir": "common-lib" } }, - "version": "main" + "version": "master" }, { "source": { diff --git a/f5-bigip-mixin/links.libsonnet b/f5-bigip-mixin/links.libsonnet new file mode 100644 index 000000000..bef619393 --- /dev/null +++ b/f5-bigip-mixin/links.libsonnet @@ -0,0 +1,35 @@ +local g = import './g.libsonnet'; + +{ + local link = g.dashboard.link, + new(this): { + clusterOverview: + link.link.new(this.config.dashboardNamePrefix + ' cluster overview', '/d/' + this.grafana.dashboards['f5-bigip-cluster-overview.json'].uid) + + link.link.options.withKeepTime(true), + + nodeOverview: + link.link.new(this.config.dashboardNamePrefix + ' node overview', '/d/' + this.grafana.dashboards['f5-bigip-node-overview.json'].uid) + + link.link.options.withKeepTime(true), + + poolOverview: + link.link.new(this.config.dashboardNamePrefix + ' pool overview', '/d/' + this.grafana.dashboards['f5-bigip-pool-overview.json'].uid) + + link.link.options.withKeepTime(true), + + virtualServerOverview: + link.link.new(this.config.dashboardNamePrefix + ' virtual server overview', '/d/' + this.grafana.dashboards['f5-bigip-virtual-server-overview.json'].uid) + + link.link.options.withKeepTime(true), + + otherDashboards: + link.dashboards.new('All dashboards', this.config.dashboardTags) + + link.dashboards.options.withIncludeVars(true) + + link.dashboards.options.withKeepTime(true) + + link.dashboards.options.withAsDropdown(true), + } + + + if this.config.enableLokiLogs then + { + logs: + link.link.new(this.config.dashboardNamePrefix + ' logs', '/d/' + this.grafana.dashboards['f5-bigip-logs.json'].uid) + + link.link.options.withKeepTime(true), + } else {}, +} diff --git a/f5-bigip-mixin/main.libsonnet b/f5-bigip-mixin/main.libsonnet new file mode 100644 index 000000000..6a15074ad --- /dev/null +++ b/f5-bigip-mixin/main.libsonnet @@ -0,0 +1,49 @@ +local alerts = import './alerts.libsonnet'; +local config = import './config.libsonnet'; +local dashboards = import './dashboards.libsonnet'; +local g = import './g.libsonnet'; +local links = import './links.libsonnet'; +local panels = import './panels.libsonnet'; +local rows = import './rows.libsonnet'; +local commonlib = import 'common-lib/common/main.libsonnet'; + +{ + new(): { + local this = self, + config: config, + + signals: + { + [sig]: commonlib.signals.unmarshallJsonMulti( + this.config.signals[sig], + type=this.config.metricsSource + ) + for sig in std.objectFields(this.config.signals) + }, + + grafana: { + variables: commonlib.variables.new( + filteringSelector=this.config.filteringSelector, + groupLabels=this.config.groupLabels, + instanceLabels=this.config.instanceLabels, + varMetric='bigip_node_status_availability_state', + customAllValue='.+', + enableLokiLogs=this.config.enableLokiLogs, + ), + annotations: {}, + links: links.new(this), + panels: panels.new(this), + rows: rows.new(this), + dashboards: dashboards.new(this), + }, + + prometheus: { + alerts: alerts.new(this), + recordingRules: {}, + }, + }, + + withConfigMixin(config): { + config+: config, + }, +} diff --git a/f5-bigip-mixin/mixin.libsonnet b/f5-bigip-mixin/mixin.libsonnet index 4d987cf31..f59386b8c 100644 --- a/f5-bigip-mixin/mixin.libsonnet +++ b/f5-bigip-mixin/mixin.libsonnet @@ -1,3 +1,15 @@ -(import 'dashboards/dashboards.libsonnet') + -(import 'alerts/alerts.libsonnet') + -(import 'config.libsonnet') +local lib = import './main.libsonnet'; + +local f5BigIP = + lib.new() + + lib.withConfigMixin({ + // Override defaults if needed + }); + +{ + grafanaDashboards+:: f5BigIP.grafana.dashboards, + prometheusAlerts+:: f5BigIP.prometheus.alerts, + prometheusRules+:: { + groups+: [], + }, +} diff --git a/f5-bigip-mixin/panels.libsonnet b/f5-bigip-mixin/panels.libsonnet new file mode 100644 index 000000000..bea34e064 --- /dev/null +++ b/f5-bigip-mixin/panels.libsonnet @@ -0,0 +1,505 @@ +local g = import './g.libsonnet'; +local commonlib = import 'common-lib/common/main.libsonnet'; + +{ + new(this):: + { + local signals = this.signals, + local vars = this.grafana.variables, + + // + // Cluster Overview Panels + // + nodeAvailability: + g.panel.gauge.new('Node availability') + + g.panel.gauge.panelOptions.withDescription('The percentage of nodes available.') + + g.panel.gauge.queryOptions.withTargets([ + signals.system.nodeAvailabilityPercentage.asTarget(), + ]) + + g.panel.gauge.standardOptions.withUnit('percent') + + g.panel.gauge.standardOptions.thresholds.withMode('absolute') + + g.panel.gauge.standardOptions.thresholds.withSteps([ + g.panel.gauge.thresholdStep.withColor('red') + + g.panel.gauge.thresholdStep.withValue(null), + g.panel.gauge.thresholdStep.withColor('red') + + g.panel.gauge.thresholdStep.withValue(95), + g.panel.gauge.thresholdStep.withColor('yellow') + + g.panel.gauge.thresholdStep.withValue(96), + g.panel.gauge.thresholdStep.withColor('green') + + g.panel.gauge.thresholdStep.withValue(100), + ]), + + poolAvailability: + g.panel.gauge.new('Pool availability') + + g.panel.gauge.panelOptions.withDescription('The percentage of pools available.') + + g.panel.gauge.queryOptions.withTargets([ + signals.system.poolAvailabilityPercentage.asTarget(), + ]) + + g.panel.gauge.standardOptions.withUnit('percent') + + g.panel.gauge.standardOptions.thresholds.withMode('absolute') + + g.panel.gauge.standardOptions.thresholds.withSteps([ + g.panel.gauge.thresholdStep.withColor('red') + + g.panel.gauge.thresholdStep.withValue(null), + g.panel.gauge.thresholdStep.withColor('red') + + g.panel.gauge.thresholdStep.withValue(95), + g.panel.gauge.thresholdStep.withColor('yellow') + + g.panel.gauge.thresholdStep.withValue(96), + g.panel.gauge.thresholdStep.withColor('green') + + g.panel.gauge.thresholdStep.withValue(100), + ]), + + virtualServerAvailability: + g.panel.gauge.new('Virtual server availability') + + g.panel.gauge.panelOptions.withDescription('The percentage of virtual servers available.') + + g.panel.gauge.queryOptions.withTargets([ + signals.system.virtualServerAvailabilityPercentage.asTarget(), + ]) + + g.panel.gauge.standardOptions.withUnit('percent') + + g.panel.gauge.standardOptions.thresholds.withMode('absolute') + + g.panel.gauge.standardOptions.thresholds.withSteps([ + g.panel.gauge.thresholdStep.withColor('red') + + g.panel.gauge.thresholdStep.withValue(null), + g.panel.gauge.thresholdStep.withColor('red') + + g.panel.gauge.thresholdStep.withValue(95), + g.panel.gauge.thresholdStep.withColor('yellow') + + g.panel.gauge.thresholdStep.withValue(96), + g.panel.gauge.thresholdStep.withColor('green') + + g.panel.gauge.thresholdStep.withValue(100), + ]), + + topActiveServersideNodes: + g.panel.barGauge.new('Top active serverside nodes') + + g.panel.barGauge.panelOptions.withDescription('Nodes with the highest number of active serverside connections.') + + g.panel.barGauge.queryOptions.withTargets([ + signals.nodes.topActiveServersideNodes.asTarget(), + ]) + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.thresholdStep.withColor('green') + + g.panel.barGauge.thresholdStep.withValue(null), + ]) + + g.panel.barGauge.options.withDisplayMode('gradient') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.withShowUnfilled(true), + + topOutboundTrafficNodes: + g.panel.barGauge.new('Top outbound traffic nodes / $__interval') + + g.panel.barGauge.panelOptions.withDescription('Nodes with the highest outbound traffic.') + + g.panel.barGauge.queryOptions.withTargets([ + signals.nodes.topOutboundTrafficNodes.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.barGauge.standardOptions.withUnit('decbytes') + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.thresholdStep.withColor('green') + + g.panel.barGauge.thresholdStep.withValue(null), + ]) + + g.panel.barGauge.options.withDisplayMode('gradient') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.withShowUnfilled(true), + + topActiveMembersInPools: + g.panel.barGauge.new('Top active members in pools') + + g.panel.barGauge.panelOptions.withDescription('Pools with the highest number of active members.') + + g.panel.barGauge.queryOptions.withTargets([ + signals.pools.topActiveMembersInPools.asTarget(), + ]) + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.thresholdStep.withColor('green') + + g.panel.barGauge.thresholdStep.withValue(null), + ]) + + g.panel.barGauge.options.withDisplayMode('gradient') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.withShowUnfilled(true), + + topRequestedPools: + g.panel.barGauge.new('Top requested pools / $__interval') + + g.panel.barGauge.panelOptions.withDescription('Pools with the highest number of requests.') + + g.panel.barGauge.queryOptions.withTargets([ + signals.pools.topRequestedPools.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.thresholdStep.withColor('green') + + g.panel.barGauge.thresholdStep.withValue(null), + ]) + + g.panel.barGauge.options.withDisplayMode('gradient') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.withShowUnfilled(true), + + topQueueDepthPools: + g.panel.barGauge.new('Top queue depth pools') + + g.panel.barGauge.panelOptions.withDescription('Pools with the highest connection queue depth.') + + g.panel.barGauge.queryOptions.withTargets([ + signals.pools.topQueueDepth.asTarget(), + ]) + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.thresholdStep.withColor('green') + + g.panel.barGauge.thresholdStep.withValue(null), + ]) + + g.panel.barGauge.options.withDisplayMode('gradient') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.withShowUnfilled(true), + + topUtilizedVirtualServers: + g.panel.barGauge.new('Top utilized virtual servers') + + g.panel.barGauge.panelOptions.withDescription('Virtual servers with the highest number of current clientside connections.') + + g.panel.barGauge.queryOptions.withTargets([ + signals.virtualServers.topUtilizedVirtualServers.asTarget(), + ]) + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.thresholdStep.withColor('green') + + g.panel.barGauge.thresholdStep.withValue(null), + ]) + + g.panel.barGauge.options.withDisplayMode('gradient') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.withShowUnfilled(true), + + topLatencyVirtualServers: + g.panel.barGauge.new('Top latency virtual servers') + + g.panel.barGauge.panelOptions.withDescription('Virtual servers with the highest mean connection duration.') + + g.panel.barGauge.queryOptions.withTargets([ + signals.virtualServers.topLatencyVirtualServers.asTarget(), + ]) + + g.panel.barGauge.standardOptions.withUnit('ms') + + g.panel.barGauge.standardOptions.withMin(0) + + g.panel.barGauge.standardOptions.thresholds.withSteps([ + g.panel.barGauge.thresholdStep.withColor('green') + + g.panel.barGauge.thresholdStep.withValue(null), + ]) + + g.panel.barGauge.options.withDisplayMode('gradient') + + g.panel.barGauge.options.withOrientation('horizontal') + + g.panel.barGauge.options.withShowUnfilled(true), + + // + // Node Overview Panels + // + nodeAvailabilityStatus: + g.panel.table.new('Availability status') + + g.panel.table.panelOptions.withDescription('The availability status of the node.') + + g.panel.table.queryOptions.withTargets([ + signals.nodes.statusAvailabilityState.asTarget() + + g.query.prometheus.withIntervalFactor(2) + + g.query.prometheus.withInstant(true) + + g.query.prometheus.withFormat('table'), + ]) + + g.panel.table.standardOptions.withMappings([ + g.panel.table.standardOptions.mapping.ValueMap.withType() + + g.panel.table.standardOptions.mapping.ValueMap.withOptions({ + '0': { color: 'red', index: 1, text: 'Unavailable' }, + '1': { color: 'green', index: 0, text: 'Available' }, + }), + ]) + + g.panel.table.standardOptions.withOverrides([ + g.panel.table.fieldOverride.byName.new('Time') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('job') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('__name__') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('partition') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('instance') + + g.panel.table.fieldOverride.byName.withProperty('displayName', 'Instance'), + g.panel.table.fieldOverride.byName.new('node') + + g.panel.table.fieldOverride.byName.withProperty('displayName', 'Node'), + g.panel.table.fieldOverride.byName.new('Value') + + g.panel.table.fieldOverride.byName.withProperty('displayName', 'Status'), + ]), + + nodeCurrentSessions: + g.panel.timeSeries.new('Current sessions') + + g.panel.timeSeries.panelOptions.withDescription('The number of current sessions on the node.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.nodes.currentSessions.asTarget(), + ]) + + g.panel.timeSeries.standardOptions.withUnit('short') + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + nodeRequests: + g.panel.timeSeries.new('Requests / $__interval') + + g.panel.timeSeries.panelOptions.withDescription('The number of requests made to the node.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.nodes.totalRequests.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.timeSeries.fieldConfig.defaults.custom.withFillOpacity(30) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + nodeServersideBytesIn: + g.panel.timeSeries.new('Serverside bytes in / $__interval') + + g.panel.timeSeries.panelOptions.withDescription('The number of bytes received on the serverside.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.nodes.serversideBytesIn.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.timeSeries.standardOptions.withUnit('bytes') + + g.panel.timeSeries.fieldConfig.defaults.custom.withFillOpacity(30) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + nodeServersideBytesOut: + g.panel.timeSeries.new('Serverside bytes out / $__interval') + + g.panel.timeSeries.panelOptions.withDescription('The number of bytes sent on the serverside.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.nodes.serversideBytesOut.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.timeSeries.standardOptions.withUnit('bytes') + + g.panel.timeSeries.fieldConfig.defaults.custom.withFillOpacity(30) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + nodeServersideCurrentConnections: + g.panel.timeSeries.new('Serverside current connections') + + g.panel.timeSeries.panelOptions.withDescription('The number of current serverside connections on the node.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.nodes.serversideCurrentConnections.asTarget(), + ]) + + g.panel.timeSeries.standardOptions.withUnit('short') + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + nodeServersideMaxConnections: + g.panel.timeSeries.new('Serverside max connections') + + g.panel.timeSeries.panelOptions.withDescription('The maximum number of serverside connections on the node.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.nodes.serversideMaxConnections.asTarget(), + ]) + + g.panel.timeSeries.standardOptions.withUnit('short') + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + // + // Pool Overview Panels + // + poolAvailabilityStatus: + g.panel.table.new('Availability status') + + g.panel.table.panelOptions.withDescription('The availability status of the pool.') + + g.panel.table.queryOptions.withTargets([ + signals.pools.statusAvailabilityState.asTarget() + + g.query.prometheus.withIntervalFactor(2) + + g.query.prometheus.withInstant(true) + + g.query.prometheus.withFormat('table'), + ]) + + g.panel.table.standardOptions.withMappings([ + g.panel.table.standardOptions.mapping.ValueMap.withType() + + g.panel.table.standardOptions.mapping.ValueMap.withOptions({ + '0': { color: 'red', index: 1, text: 'Unavailable' }, + '1': { color: 'green', index: 0, text: 'Available' }, + }), + ]) + + g.panel.table.standardOptions.withOverrides([ + g.panel.table.fieldOverride.byName.new('Time') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('job') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('__name__') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('partition') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('instance') + + g.panel.table.fieldOverride.byName.withProperty('displayName', 'Instance'), + g.panel.table.fieldOverride.byName.new('pool') + + g.panel.table.fieldOverride.byName.withProperty('displayName', 'Pool'), + g.panel.table.fieldOverride.byName.new('Value') + + g.panel.table.fieldOverride.byName.withProperty('displayName', 'Status'), + ]), + + poolActiveMemberCount: + g.panel.timeSeries.new('Active member count') + + g.panel.timeSeries.panelOptions.withDescription('The number of active members in the pool.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.pools.activeMemberCount.asTarget(), + ]) + + g.panel.timeSeries.standardOptions.withUnit('short') + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + poolConnectionQueueDepth: + g.panel.timeSeries.new('Connection queue depth') + + g.panel.timeSeries.panelOptions.withDescription('The depth of the connection queue.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.pools.connectionQueueDepth.asTarget(), + ]) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + poolRequests: + g.panel.timeSeries.new('Requests / $__interval') + + g.panel.timeSeries.panelOptions.withDescription('The number of requests made to the pool.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.pools.totalRequests.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.timeSeries.fieldConfig.defaults.custom.withFillOpacity(30) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + poolServersideBytesIn: + g.panel.timeSeries.new('Serverside bytes in / $__interval') + + g.panel.timeSeries.panelOptions.withDescription('The number of bytes received on the serverside.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.pools.serversideBytesIn.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.timeSeries.standardOptions.withUnit('bytes') + + g.panel.timeSeries.fieldConfig.defaults.custom.withFillOpacity(30) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + poolServersideBytesOut: + g.panel.timeSeries.new('Serverside bytes out / $__interval') + + g.panel.timeSeries.panelOptions.withDescription('The number of bytes sent on the serverside.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.pools.serversideBytesOut.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.timeSeries.standardOptions.withUnit('bytes') + + g.panel.timeSeries.fieldConfig.defaults.custom.withFillOpacity(30) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + poolServersideCurrentConnections: + g.panel.timeSeries.new('Serverside current connections') + + g.panel.timeSeries.panelOptions.withDescription('The number of current serverside connections on the pool.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.pools.serversideCurrentConnections.asTarget(), + ]) + + g.panel.timeSeries.standardOptions.withUnit('short') + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + // + // Virtual Server Overview Panels + // + virtualServerAvailabilityStatus: + g.panel.table.new('Availability status') + + g.panel.table.panelOptions.withDescription('The availability status of the virtual server.') + + g.panel.table.queryOptions.withTargets([ + signals.virtualServers.statusAvailabilityState.asTarget() + + g.query.prometheus.withIntervalFactor(2) + + g.query.prometheus.withInstant(true) + + g.query.prometheus.withFormat('table'), + ]) + + g.panel.table.standardOptions.withMappings([ + g.panel.table.standardOptions.mapping.ValueMap.withType() + + g.panel.table.standardOptions.mapping.ValueMap.withOptions({ + '0': { color: 'red', index: 1, text: 'Unavailable' }, + '1': { color: 'green', index: 0, text: 'Available' }, + }), + ]) + + g.panel.table.standardOptions.withOverrides([ + g.panel.table.fieldOverride.byName.new('Time') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('job') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('__name__') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('partition') + + g.panel.table.fieldOverride.byName.withProperty('custom.hidden', true), + g.panel.table.fieldOverride.byName.new('instance') + + g.panel.table.fieldOverride.byName.withProperty('displayName', 'Instance'), + g.panel.table.fieldOverride.byName.new('virtual_server') + + g.panel.table.fieldOverride.byName.withProperty('displayName', 'Virtual Server'), + g.panel.table.fieldOverride.byName.new('Value') + + g.panel.table.fieldOverride.byName.withProperty('displayName', 'Status'), + ]), + + virtualServerClientsideCurrentConnections: + g.panel.timeSeries.new('Clientside current connections') + + g.panel.timeSeries.panelOptions.withDescription('The number of current clientside connections on the virtual server.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.virtualServers.clientsideCurrentConnections.asTarget(), + ]) + + g.panel.timeSeries.standardOptions.withUnit('short') + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + virtualServerRequests: + g.panel.timeSeries.new('Requests / $__interval') + + g.panel.timeSeries.panelOptions.withDescription('The number of requests made to the virtual server.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.virtualServers.totalRequests.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.timeSeries.fieldConfig.defaults.custom.withFillOpacity(30) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + virtualServerClientsideBytesIn: + g.panel.timeSeries.new('Clientside bytes in / $__interval') + + g.panel.timeSeries.panelOptions.withDescription('The number of bytes received on the clientside.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.virtualServers.clientsideBytesIn.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.timeSeries.standardOptions.withUnit('bytes') + + g.panel.timeSeries.fieldConfig.defaults.custom.withFillOpacity(30) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + virtualServerClientsideBytesOut: + g.panel.timeSeries.new('Clientside bytes out / $__interval') + + g.panel.timeSeries.panelOptions.withDescription('The number of bytes sent on the clientside.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.virtualServers.clientsideBytesOut.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.timeSeries.standardOptions.withUnit('bytes') + + g.panel.timeSeries.fieldConfig.defaults.custom.withFillOpacity(30) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + virtualServerMeanConnectionDuration: + g.panel.timeSeries.new('Mean connection duration') + + g.panel.timeSeries.panelOptions.withDescription('The mean connection duration on the virtual server.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.virtualServers.meanConnectionDuration.asTarget(), + ]) + + g.panel.timeSeries.standardOptions.withUnit('ms') + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + virtualServerEphemeralCurrentConnections: + g.panel.timeSeries.new('Ephemeral current connections') + + g.panel.timeSeries.panelOptions.withDescription('The number of current ephemeral connections on the virtual server.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.virtualServers.ephemeralCurrentConnections.asTarget(), + ]) + + g.panel.timeSeries.standardOptions.withUnit('short') + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + virtualServerEphemeralBytesIn: + g.panel.timeSeries.new('Ephemeral bytes in / $__interval') + + g.panel.timeSeries.panelOptions.withDescription('The number of ephemeral bytes received.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.virtualServers.ephemeralBytesIn.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.timeSeries.standardOptions.withUnit('bytes') + + g.panel.timeSeries.fieldConfig.defaults.custom.withFillOpacity(30) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + + virtualServerEphemeralBytesOut: + g.panel.timeSeries.new('Ephemeral bytes out / $__interval') + + g.panel.timeSeries.panelOptions.withDescription('The number of ephemeral bytes sent.') + + g.panel.timeSeries.queryOptions.withTargets([ + signals.virtualServers.ephemeralBytesOut.asTarget() + + g.query.prometheus.withInterval('1m'), + ]) + + g.panel.timeSeries.standardOptions.withUnit('bytes') + + g.panel.timeSeries.fieldConfig.defaults.custom.withFillOpacity(30) + + g.panel.timeSeries.options.legend.withDisplayMode('list') + + g.panel.timeSeries.options.legend.withPlacement('bottom'), + }, +} diff --git a/f5-bigip-mixin/prometheus_rules_out/prometheus_alerts.yaml b/f5-bigip-mixin/prometheus_rules_out/prometheus_alerts.yaml index 8ef7b8778..3a9c1917a 100644 --- a/f5-bigip-mixin/prometheus_rules_out/prometheus_alerts.yaml +++ b/f5-bigip-mixin/prometheus_rules_out/prometheus_alerts.yaml @@ -1,5 +1,5 @@ groups: - - name: bigip-alerts + - name: f5-bigip-alerts rules: - alert: BigIPLowNodeAvailabilityStatus annotations: diff --git a/f5-bigip-mixin/rows.libsonnet b/f5-bigip-mixin/rows.libsonnet new file mode 100644 index 000000000..23099aa4c --- /dev/null +++ b/f5-bigip-mixin/rows.libsonnet @@ -0,0 +1,92 @@ +local g = import './g.libsonnet'; + +{ + new(this): { + local panels = this.grafana.panels, + + // + // Cluster Overview Rows + // + clusterOverviewRow: + g.panel.row.new('Overview') + + g.panel.row.withPanels([ + panels.nodeAvailability { gridPos: { h: 5, w: 8, x: 0, y: 0 } }, + panels.poolAvailability { gridPos: { h: 5, w: 8, x: 8, y: 0 } }, + panels.virtualServerAvailability { gridPos: { h: 5, w: 8, x: 16, y: 0 } }, + panels.topActiveServersideNodes { gridPos: { h: 5, w: 12, x: 0, y: 5 } }, + panels.topOutboundTrafficNodes { gridPos: { h: 5, w: 12, x: 12, y: 5 } }, + panels.topActiveMembersInPools { gridPos: { h: 5, w: 8, x: 0, y: 10 } }, + panels.topRequestedPools { gridPos: { h: 5, w: 8, x: 8, y: 10 } }, + panels.topQueueDepthPools { gridPos: { h: 5, w: 8, x: 16, y: 10 } }, + panels.topUtilizedVirtualServers { gridPos: { h: 5, w: 12, x: 0, y: 15 } }, + panels.topLatencyVirtualServers { gridPos: { h: 5, w: 12, x: 12, y: 15 } }, + ]), + + // + // Node Overview Rows + // + nodeStatusRow: + g.panel.row.new('Status') + + g.panel.row.withPanels([ + panels.nodeAvailabilityStatus { gridPos: { h: 9, w: 24, x: 0, y: 0 } }, + ]), + + nodeMetricsRow: + g.panel.row.new('Metrics') + + g.panel.row.withPanels([ + panels.nodeCurrentSessions { gridPos: { h: 8, w: 12, x: 0, y: 0 } }, + panels.nodeRequests { gridPos: { h: 8, w: 12, x: 12, y: 0 } }, + panels.nodeServersideBytesIn { gridPos: { h: 8, w: 12, x: 0, y: 8 } }, + panels.nodeServersideBytesOut { gridPos: { h: 8, w: 12, x: 12, y: 8 } }, + panels.nodeServersideCurrentConnections { gridPos: { h: 8, w: 12, x: 0, y: 16 } }, + panels.nodeServersideMaxConnections { gridPos: { h: 8, w: 12, x: 12, y: 16 } }, + ]), + + // + // Pool Overview Rows + // + poolStatusRow: + g.panel.row.new('Status') + + g.panel.row.withPanels([ + panels.poolAvailabilityStatus { gridPos: { h: 9, w: 24, x: 0, y: 0 } }, + ]), + + poolMetricsRow: + g.panel.row.new('Metrics') + + g.panel.row.withPanels([ + panels.poolActiveMemberCount { gridPos: { h: 8, w: 12, x: 0, y: 0 } }, + panels.poolConnectionQueueDepth { gridPos: { h: 8, w: 12, x: 12, y: 0 } }, + panels.poolRequests { gridPos: { h: 8, w: 12, x: 0, y: 8 } }, + panels.poolServersideBytesIn { gridPos: { h: 8, w: 12, x: 12, y: 8 } }, + panels.poolServersideBytesOut { gridPos: { h: 8, w: 12, x: 0, y: 16 } }, + panels.poolServersideCurrentConnections { gridPos: { h: 8, w: 12, x: 12, y: 16 } }, + ]), + + // + // Virtual Server Overview Rows + // + virtualServerStatusRow: + g.panel.row.new('Status') + + g.panel.row.withPanels([ + panels.virtualServerAvailabilityStatus { gridPos: { h: 9, w: 24, x: 0, y: 0 } }, + ]), + + virtualServerClientsideMetricsRow: + g.panel.row.new('Clientside Metrics') + + g.panel.row.withPanels([ + panels.virtualServerClientsideCurrentConnections { gridPos: { h: 8, w: 12, x: 0, y: 0 } }, + panels.virtualServerRequests { gridPos: { h: 8, w: 12, x: 12, y: 0 } }, + panels.virtualServerClientsideBytesIn { gridPos: { h: 8, w: 12, x: 0, y: 8 } }, + panels.virtualServerClientsideBytesOut { gridPos: { h: 8, w: 12, x: 12, y: 8 } }, + panels.virtualServerMeanConnectionDuration { gridPos: { h: 8, w: 12, x: 0, y: 16 } }, + ]), + + virtualServerEphemeralMetricsRow: + g.panel.row.new('Ephemeral Metrics') + + g.panel.row.withPanels([ + panels.virtualServerEphemeralCurrentConnections { gridPos: { h: 8, w: 12, x: 0, y: 0 } }, + panels.virtualServerEphemeralBytesIn { gridPos: { h: 8, w: 12, x: 12, y: 0 } }, + panels.virtualServerEphemeralBytesOut { gridPos: { h: 8, w: 12, x: 0, y: 8 } }, + ]), + }, +} diff --git a/f5-bigip-mixin/signals/nodes.libsonnet b/f5-bigip-mixin/signals/nodes.libsonnet new file mode 100644 index 000000000..9f4c8d592 --- /dev/null +++ b/f5-bigip-mixin/signals/nodes.libsonnet @@ -0,0 +1,162 @@ +function(this) + { + filteringSelector: this.filteringSelector, + groupLabels: this.groupLabels, + instanceLabels: this.instanceLabels, + aggLevel: 'instance', + aggFunction: 'avg', + signals: { + + // Node status and state + statusAvailabilityState: { + name: 'Node availability status', + type: 'gauge', + description: 'The availability status of the node.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_node_status_availability_state{%(queriesSelector)s, node=~"$bigip_node", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{node}} - {{instance}}', + }, + }, + }, + + // Current metrics + currentSessions: { + name: 'Current sessions', + type: 'gauge', + description: 'The number of current sessions on the node.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_node_cur_sessions{%(queriesSelector)s, node=~"$bigip_node", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{node}} - {{instance}}', + }, + }, + }, + + serversideCurrentConnections: { + name: 'Serverside current connections', + type: 'gauge', + description: 'The number of current serverside connections on the node.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_node_serverside_cur_conns{%(queriesSelector)s, node=~"$bigip_node", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{node}} - {{instance}}', + }, + }, + }, + + serversideMaxConnections: { + name: 'Serverside max connections', + type: 'gauge', + description: 'The maximum number of serverside connections on the node.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_node_serverside_max_conns{%(queriesSelector)s, node=~"$bigip_node", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{node}} - {{instance}}', + }, + }, + }, + + // Counter metrics (with increase) + totalRequests: { + name: 'Total requests', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of requests made to the node.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_node_tot_requests{%(queriesSelector)s, node=~"$bigip_node", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{node}} - {{instance}}', + }, + }, + }, + + serversideBytesIn: { + name: 'Serverside bytes in', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of bytes received on the serverside.', + unit: 'bytes', + sources: { + prometheus: { + expr: 'bigip_node_serverside_bytes_in{%(queriesSelector)s, node=~"$bigip_node", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{node}} - {{instance}}', + }, + }, + }, + + serversideBytesOut: { + name: 'Serverside bytes out', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of bytes sent on the serverside.', + unit: 'bytes', + sources: { + prometheus: { + expr: 'bigip_node_serverside_bytes_out{%(queriesSelector)s, node=~"$bigip_node", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{node}} - {{instance}}', + }, + }, + }, + + serversidePacketsIn: { + name: 'Serverside packets in', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of packets received on the serverside.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_node_serverside_pkts_in{%(queriesSelector)s, node=~"$bigip_node", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{node}} - {{instance}}', + }, + }, + }, + + serversidePacketsOut: { + name: 'Serverside packets out', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of packets sent on the serverside.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_node_serverside_pkts_out{%(queriesSelector)s, node=~"$bigip_node", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{node}} - {{instance}}', + }, + }, + }, + + // Top metrics (using topk) + topActiveServersideNodes: { + name: 'Top active serverside nodes', + type: 'raw', + description: 'Nodes with the highest number of active serverside connections.', + unit: 'none', + sources: { + prometheus: { + expr: 'topk($k, bigip_node_serverside_cur_conns{%(queriesSelector)s, partition=~"$bigip_partition"})', + legendCustomTemplate: '{{node}} - {{instance}}', + }, + }, + }, + + topOutboundTrafficNodes: { + name: 'Top outbound traffic nodes', + type: 'raw', + description: 'Nodes with the highest outbound traffic.', + unit: 'decbytes', + sources: { + prometheus: { + expr: 'topk($k, increase(bigip_node_serverside_bytes_out{%(queriesSelector)s, partition=~"$bigip_partition"}[$__interval:]))', + legendCustomTemplate: '{{node}} - {{instance}}', + }, + }, + }, + }, + } diff --git a/f5-bigip-mixin/signals/pools.libsonnet b/f5-bigip-mixin/signals/pools.libsonnet new file mode 100644 index 000000000..630394e55 --- /dev/null +++ b/f5-bigip-mixin/signals/pools.libsonnet @@ -0,0 +1,203 @@ +function(this) + { + filteringSelector: this.filteringSelector, + groupLabels: this.groupLabels, + instanceLabels: this.instanceLabels, + aggLevel: 'instance', + aggFunction: 'avg', + signals: { + + // Pool status and state + statusAvailabilityState: { + name: 'Pool availability status', + type: 'gauge', + description: 'The availability status of the pool.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_pool_status_availability_state{%(queriesSelector)s, pool=~"$bigip_pool", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + // Member metrics + activeMemberCount: { + name: 'Active member count', + type: 'gauge', + description: 'The number of active members in the pool.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_pool_active_member_cnt{%(queriesSelector)s, pool=~"$bigip_pool", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + minimumActiveMbers: { + name: 'Minimum active members', + type: 'gauge', + description: 'The minimum number of active members in the pool.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_pool_min_active_members{%(queriesSelector)s, pool=~"$bigip_pool", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + // Connection queue metrics + connectionQueueDepth: { + name: 'Connection queue depth', + type: 'gauge', + description: 'The depth of the connection queue.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_pool_connq_depth{%(queriesSelector)s, pool=~"$bigip_pool", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + connectionQueueServiced: { + name: 'Connection queue serviced', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of connections serviced from the queue.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_pool_connq_serviced{%(queriesSelector)s, pool=~"$bigip_pool", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + // Connection metrics + serversideCurrentConnections: { + name: 'Serverside current connections', + type: 'gauge', + description: 'The number of current serverside connections on the pool.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_pool_serverside_cur_conns{%(queriesSelector)s, pool=~"$bigip_pool", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + serversideMaxConnections: { + name: 'Serverside max connections', + type: 'gauge', + description: 'The maximum number of serverside connections on the pool.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_pool_serverside_max_conns{%(queriesSelector)s, pool=~"$bigip_pool", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + // Counter metrics (with increase) + totalRequests: { + name: 'Total requests', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of requests made to the pool.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_pool_tot_requests{%(queriesSelector)s, pool=~"$bigip_pool", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + serversideBytesIn: { + name: 'Serverside bytes in', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of bytes received on the serverside.', + unit: 'bytes', + sources: { + prometheus: { + expr: 'bigip_pool_serverside_bytes_in{%(queriesSelector)s, pool=~"$bigip_pool", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + serversideBytesOut: { + name: 'Serverside bytes out', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of bytes sent on the serverside.', + unit: 'bytes', + sources: { + prometheus: { + expr: 'bigip_pool_serverside_bytes_out{%(queriesSelector)s, pool=~"$bigip_pool", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + serversidePacketsOut: { + name: 'Serverside packets out', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of packets sent on the serverside.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_pool_serverside_pkts_out{%(queriesSelector)s, pool=~"$bigip_pool", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + // Top metrics (using topk) + topActiveMembersInPools: { + name: 'Top active members in pools', + type: 'raw', + description: 'Pools with the highest number of active members.', + unit: 'none', + sources: { + prometheus: { + expr: 'topk($k, bigip_pool_active_member_cnt{%(queriesSelector)s, partition=~"$bigip_partition"})', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + topRequestedPools: { + name: 'Top requested pools', + type: 'raw', + description: 'Pools with the highest number of requests.', + unit: 'none', + sources: { + prometheus: { + expr: 'topk($k, increase(bigip_pool_tot_requests{%(queriesSelector)s, partition=~"$bigip_partition"}[$__interval:]))', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + + topQueueDepth: { + name: 'Top queue depth', + type: 'raw', + description: 'Pools with the highest connection queue depth.', + unit: 'none', + sources: { + prometheus: { + expr: 'topk($k, bigip_pool_connq_depth{%(queriesSelector)s, partition=~"$bigip_partition"})', + legendCustomTemplate: '{{pool}} - {{instance}}', + }, + }, + }, + }, + } diff --git a/f5-bigip-mixin/signals/system.libsonnet b/f5-bigip-mixin/signals/system.libsonnet new file mode 100644 index 000000000..fc9a01804 --- /dev/null +++ b/f5-bigip-mixin/signals/system.libsonnet @@ -0,0 +1,50 @@ +function(this) + { + filteringSelector: this.filteringSelector, + groupLabels: this.groupLabels, + instanceLabels: this.instanceLabels, + aggLevel: 'instance', + aggFunction: 'avg', + signals: { + + // Cluster-level availability percentages (complex raw queries) + nodeAvailabilityPercentage: { + name: 'Node availability percentage', + type: 'raw', + description: 'The percentage of nodes available.', + unit: 'percent', + sources: { + prometheus: { + expr: '100 * sum by(partition, instance, job) (bigip_node_status_availability_state{%(queriesSelector)s, partition=~"$bigip_partition"}) / clamp_min(count by(partition, instance, job) (bigip_node_status_availability_state{%(queriesSelector)s, partition=~"$bigip_partition"}),1)', + legendCustomTemplate: '{{instance}}', + }, + }, + }, + + poolAvailabilityPercentage: { + name: 'Pool availability percentage', + type: 'raw', + description: 'The percentage of pools available.', + unit: 'percent', + sources: { + prometheus: { + expr: '100 * sum by(partition, instance, job) (bigip_pool_status_availability_state{%(queriesSelector)s, partition=~"$bigip_partition"}) / clamp_min(count by(partition, instance, job) (bigip_pool_status_availability_state{%(queriesSelector)s, partition=~"$bigip_partition"}),1)', + legendCustomTemplate: '{{instance}}', + }, + }, + }, + + virtualServerAvailabilityPercentage: { + name: 'Virtual server availability percentage', + type: 'raw', + description: 'The percentage of virtual servers available.', + unit: 'percent', + sources: { + prometheus: { + expr: '100 * sum by(partition, instance, job) (bigip_vs_status_availability_state{%(queriesSelector)s, partition=~"$bigip_partition"}) / clamp_min(count by(partition, instance, job) (bigip_vs_status_availability_state{%(queriesSelector)s, partition=~"$bigip_partition"}),1)', + legendCustomTemplate: '{{instance}}', + }, + }, + }, + }, + } diff --git a/f5-bigip-mixin/signals/virtual-servers.libsonnet b/f5-bigip-mixin/signals/virtual-servers.libsonnet new file mode 100644 index 000000000..e934278b4 --- /dev/null +++ b/f5-bigip-mixin/signals/virtual-servers.libsonnet @@ -0,0 +1,274 @@ +function(this) + { + filteringSelector: this.filteringSelector, + groupLabels: this.groupLabels, + instanceLabels: this.instanceLabels, + aggLevel: 'instance', + aggFunction: 'avg', + signals: { + + // Virtual server status and state + statusAvailabilityState: { + name: 'Virtual server availability status', + type: 'gauge', + description: 'The availability status of the virtual server.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_status_availability_state{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + // Clientside metrics + clientsideCurrentConnections: { + name: 'Clientside current connections', + type: 'gauge', + description: 'The number of current clientside connections on the virtual server.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_clientside_cur_conns{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + clientsideMaxConnections: { + name: 'Clientside max connections', + type: 'gauge', + description: 'The maximum number of clientside connections on the virtual server.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_clientside_max_conns{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + clientsideBytesIn: { + name: 'Clientside bytes in', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of bytes received on the clientside.', + unit: 'bytes', + sources: { + prometheus: { + expr: 'bigip_vs_clientside_bytes_in{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + clientsideBytesOut: { + name: 'Clientside bytes out', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of bytes sent on the clientside.', + unit: 'bytes', + sources: { + prometheus: { + expr: 'bigip_vs_clientside_bytes_out{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + clientsideEvictedConnections: { + name: 'Clientside evicted connections', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of clientside connections evicted.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_clientside_evicted_conns{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + clientsidePacketsIn: { + name: 'Clientside packets in', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of packets received on the clientside.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_clientside_pkts_in{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + clientsidePacketsOut: { + name: 'Clientside packets out', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of packets sent on the clientside.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_clientside_pkts_out{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + // Connection duration + meanConnectionDuration: { + name: 'Mean connection duration', + type: 'gauge', + description: 'The mean connection duration on the virtual server.', + unit: 'ms', + sources: { + prometheus: { + expr: 'bigip_vs_cs_mean_conn_dur{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + // Ephemeral metrics + ephemeralCurrentConnections: { + name: 'Ephemeral current connections', + type: 'gauge', + description: 'The number of current ephemeral connections on the virtual server.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_ephemeral_cur_conns{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + ephemeralMaxConnections: { + name: 'Ephemeral max connections', + type: 'gauge', + description: 'The maximum number of ephemeral connections on the virtual server.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_ephemeral_max_conns{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + ephemeralBytesIn: { + name: 'Ephemeral bytes in', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of ephemeral bytes received.', + unit: 'bytes', + sources: { + prometheus: { + expr: 'bigip_vs_ephemeral_bytes_in{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + ephemeralBytesOut: { + name: 'Ephemeral bytes out', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of ephemeral bytes sent.', + unit: 'bytes', + sources: { + prometheus: { + expr: 'bigip_vs_ephemeral_bytes_out{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + ephemeralEvictedConnections: { + name: 'Ephemeral evicted connections', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of ephemeral connections evicted.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_ephemeral_evicted_conns{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + ephemeralPacketsIn: { + name: 'Ephemeral packets in', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of ephemeral packets received.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_ephemeral_pkts_in{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + ephemeralPacketsOut: { + name: 'Ephemeral packets out', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of ephemeral packets sent.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_ephemeral_pkts_out{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + // Total requests + totalRequests: { + name: 'Total requests', + type: 'counter', + rangeFunction: 'increase', + description: 'The number of requests made to the virtual server.', + unit: 'none', + sources: { + prometheus: { + expr: 'bigip_vs_tot_requests{%(queriesSelector)s, virtual_server=~"$bigip_virtual_server", partition=~"$bigip_partition"}', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + // Top metrics (using topk) + topUtilizedVirtualServers: { + name: 'Top utilized virtual servers', + type: 'raw', + description: 'Virtual servers with the highest number of current clientside connections.', + unit: 'none', + sources: { + prometheus: { + expr: 'topk($k, bigip_vs_clientside_cur_conns{%(queriesSelector)s, partition=~"$bigip_partition"})', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + + topLatencyVirtualServers: { + name: 'Top latency virtual servers', + type: 'raw', + description: 'Virtual servers with the highest mean connection duration.', + unit: 'ms', + sources: { + prometheus: { + expr: 'topk($k, bigip_vs_cs_mean_conn_dur{%(queriesSelector)s, partition=~"$bigip_partition"})', + legendCustomTemplate: '{{virtual_server}} - {{instance}}', + }, + }, + }, + }, + }