diff --git a/packages/aws_sqs_otel/changelog.yml b/packages/aws_sqs_otel/changelog.yml index f99d8d24481..1fb645e1b5d 100644 --- a/packages/aws_sqs_otel/changelog.yml +++ b/packages/aws_sqs_otel/changelog.yml @@ -1,4 +1,9 @@ # newer versions go on top +- version: "0.13.0" + changes: + - description: Add SQS queue detail dashboard with drilldowns from the overview dashboard. + type: enhancement + link: https://github.com/elastic/integrations/pull/20974 - version: "0.12.0" changes: - description: Replace the deprecated `popout` icon with `external` so dashboard navigation cards render correctly. diff --git a/packages/aws_sqs_otel/kibana/dashboard/aws_sqs_otel-3d6dd19d-9965-423b-a2c8-bd44a255b1eb.json b/packages/aws_sqs_otel/kibana/dashboard/aws_sqs_otel-3d6dd19d-9965-423b-a2c8-bd44a255b1eb.json new file mode 100644 index 00000000000..3fa86e96f9c --- /dev/null +++ b/packages/aws_sqs_otel/kibana/dashboard/aws_sqs_otel-3d6dd19d-9965-423b-a2c8-bd44a255b1eb.json @@ -0,0 +1,42 @@ +{ + "id": "aws_sqs_otel-3d6dd19d-9965-423b-a2c8-bd44a255b1eb", + "type": "dashboard", + "namespaces": [ + "default" + ], + "updated_at": "2026-08-24T12:00:00.000Z", + "created_at": "2026-08-24T12:00:00.000Z", + "version": "WzEsMV0=", + "coreMigrationVersion": "8.8.0", + "typeMigrationVersion": "10.3.0", + "managed": false, + "attributes": { + "controlGroupInput": { + "chainingSystem": "HIERARCHICAL", + "controlStyle": "oneLine", + "ignoreParentSettingsJSON": "{\"ignoreFilters\": false, \"ignoreQuery\": false, \"ignoreTimerange\": false, \"ignoreValidations\": false}", + "panelsJSON": "{\"f1a2b3c4-d5e6-7890-abcd-ef1234567890\": {\"type\": \"optionsListControl\", \"order\": 0, \"width\": \"large\", \"grow\": true, \"explicitInput\": {\"id\": \"f1a2b3c4-d5e6-7890-abcd-ef1234567890\", \"fieldName\": \"QueueName\", \"title\": \"SQS queue\", \"dataViewId\": \"metrics-*\", \"selectedOptions\": [], \"singleSelect\": false, \"runPastTimeout\": false, \"hideExclude\": false, \"hideExists\": false, \"hideSort\": false, \"placeholder\": \"Any\"}}}", + "showApplySelections": true + }, + "description": "Per-queue detail view for an SQS queue (OTel schema). Reached via the drilldown on the [AWS SQS OTel] Metrics dashboard. All panels are scoped by the inbound QueueName filter.", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"filter\": [{\"meta\": {\"disabled\": false,\"field\": \"data_stream.dataset\",\"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index\",\"key\": \"data_stream.dataset\",\"params\": [\"aws.sqs.otel\"],\"type\": \"phrases\"},\"query\": {\"bool\": {\"minimum_should_match\": 1,\"should\": [{\"match_phrase\": {\"data_stream.dataset\": \"aws.sqs.otel\"}}]}}}],\"query\": {\"language\": \"kuery\",\"query\": \"\"}}" + }, + "optionsJSON": "{\"hidePanelTitles\": false,\"hidePanelBorders\": false,\"useMargins\": true,\"autoApplyFilters\": true,\"syncColors\": false,\"syncCursor\": true,\"syncTooltips\": false}", + "panelsJSON": "[{\"type\":\"links\",\"embeddableConfig\":{\"description\":\"\",\"hide_title\":true,\"hide_border\":true,\"layout\":\"horizontal\",\"links\":[{\"id\":\"4a8b9c2d-3e5f-6071-8293-a4b5c6d7e8f9\",\"order\":0,\"type\":\"dashboardLink\",\"label\":\"[AWS SQS OTel] Metrics\",\"destinationRefName\":\"link_4a8b9c2d-3e5f-6071-8293-a4b5c6d7e8f9_dashboard\",\"options\":{\"open_in_new_tab\":false,\"use_filters\":false,\"use_time_range\":true}}]},\"panelIndex\":\"sqsid-back-link\",\"gridData\":{\"y\":0,\"x\":0,\"w\":6,\"h\":3,\"i\":\"sqsid-back-link\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"description\":\"SQS queue name (QueueName) for the inbound drilldown filter.\",\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"layerId\":\"lid-hdr-name\",\"layerType\":\"data\",\"metricAccessor\":\"col-hdr-name\",\"showBar\":false,\"colorMode\":\"none\",\"primaryAlign\":\"left\",\"valueFontMode\":\"fit\",\"primaryPosition\":\"bottom\",\"titlesTextAlign\":\"left\"},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" AND stat == \\\"Sum\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName, cloud.region\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS name = MAX(QueueName)\\n| KEEP name\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-hdr-name\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" AND stat == \\\"Sum\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName, cloud.region\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS name = MAX(QueueName)\\n| KEEP name\"},\"columns\":[{\"fieldName\":\"name\",\"columnId\":\"col-hdr-name\",\"label\":\"Queue name\",\"customLabel\":true,\"meta\":{\"type\":\"keyword\",\"esType\":\"keyword\"},\"inMetricDimension\":true}],\"allColumns\":[{\"fieldName\":\"name\",\"columnId\":\"col-hdr-name\",\"label\":\"Queue name\",\"customLabel\":true,\"meta\":{\"type\":\"keyword\",\"esType\":\"keyword\"},\"inMetricDimension\":true}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-hdr-name\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"SQS queue name (QueueName) for the inbound drilldown filter.\"}},\"panelIndex\":\"sqsid-hdr-name\",\"gridData\":{\"y\":0,\"x\":6,\"w\":8,\"h\":3,\"i\":\"sqsid-hdr-name\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"description\":\"AWS account id (cloud.account.id) reporting this queue.\",\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"layerId\":\"lid-hdr-account\",\"layerType\":\"data\",\"metricAccessor\":\"col-hdr-account\",\"showBar\":false,\"colorMode\":\"none\",\"primaryAlign\":\"left\",\"valueFontMode\":\"fit\",\"primaryPosition\":\"bottom\",\"titlesTextAlign\":\"left\"},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" AND stat == \\\"Sum\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName, cloud.region\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS account = MAX(cloud.account.id)\\n| KEEP account\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-hdr-account\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" AND stat == \\\"Sum\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName, cloud.region\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS account = MAX(cloud.account.id)\\n| KEEP account\"},\"columns\":[{\"fieldName\":\"account\",\"columnId\":\"col-hdr-account\",\"label\":\"Account\",\"customLabel\":true,\"meta\":{\"type\":\"keyword\",\"esType\":\"keyword\"},\"inMetricDimension\":true}],\"allColumns\":[{\"fieldName\":\"account\",\"columnId\":\"col-hdr-account\",\"label\":\"Account\",\"customLabel\":true,\"meta\":{\"type\":\"keyword\",\"esType\":\"keyword\"},\"inMetricDimension\":true}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-hdr-account\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"AWS account id (cloud.account.id) reporting this queue.\"}},\"panelIndex\":\"sqsid-hdr-account\",\"gridData\":{\"y\":0,\"x\":14,\"w\":7,\"h\":3,\"i\":\"sqsid-hdr-account\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"description\":\"AWS region (cloud.region) reporting this queue.\",\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"layerId\":\"lid-hdr-region\",\"layerType\":\"data\",\"metricAccessor\":\"col-hdr-region\",\"showBar\":false,\"colorMode\":\"none\",\"primaryAlign\":\"left\",\"valueFontMode\":\"fit\",\"primaryPosition\":\"bottom\",\"titlesTextAlign\":\"left\"},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" AND stat == \\\"Sum\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName, cloud.region\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS region = MAX(cloud.region)\\n| KEEP region\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-hdr-region\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" AND stat == \\\"Sum\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName, cloud.region\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS region = MAX(cloud.region)\\n| KEEP region\"},\"columns\":[{\"fieldName\":\"region\",\"columnId\":\"col-hdr-region\",\"label\":\"Region\",\"customLabel\":true,\"meta\":{\"type\":\"keyword\",\"esType\":\"keyword\"},\"inMetricDimension\":true}],\"allColumns\":[{\"fieldName\":\"region\",\"columnId\":\"col-hdr-region\",\"label\":\"Region\",\"customLabel\":true,\"meta\":{\"type\":\"keyword\",\"esType\":\"keyword\"},\"inMetricDimension\":true}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-hdr-region\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"AWS region (cloud.region) reporting this queue.\"}},\"panelIndex\":\"sqsid-hdr-region\",\"gridData\":{\"y\":0,\"x\":21,\"w\":6,\"h\":3,\"i\":\"sqsid-hdr-region\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"description\":\"Opens Discover filtered to this queue's metrics on QueueName.\",\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"layerId\":\"lid-card-discover\",\"layerType\":\"data\",\"metricAccessor\":\"col-card-discover\",\"showBar\":false,\"colorMode\":\"background\",\"primaryAlign\":\"center\",\"valueFontMode\":\"fit\",\"primaryPosition\":\"bottom\",\"titlesTextAlign\":\"center\",\"applyColorTo\":\"background\",\"color\":\"#61a2ff00\",\"icon\":\"popout\",\"iconAlign\":\"left\",\"valuesTextSize\":\"xs\",\"titlesTextSize\":\"xxs\"},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" AND stat == \\\"Sum\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName, cloud.region\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS queue = MAX(QueueName)\\n| KEEP queue\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-card-discover\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" AND stat == \\\"Sum\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName, cloud.region\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS queue = MAX(QueueName)\\n| KEEP queue\"},\"columns\":[{\"fieldName\":\"queue\",\"columnId\":\"col-card-discover\",\"label\":\"View metrics in Discover\",\"customLabel\":true,\"meta\":{\"type\":\"string\",\"esType\":\"keyword\",\"sourceParams\":{\"indexPattern\":\"metrics-*\",\"sourceField\":\"QueueName\"},\"params\":{\"id\":\"string\"}},\"inMetricDimension\":true}],\"allColumns\":[{\"fieldName\":\"queue\",\"columnId\":\"col-card-discover\",\"label\":\"View metrics in Discover\",\"customLabel\":true,\"meta\":{\"type\":\"string\",\"esType\":\"keyword\",\"sourceParams\":{\"indexPattern\":\"metrics-*\",\"sourceField\":\"QueueName\"},\"params\":{\"id\":\"string\"}},\"inMetricDimension\":true}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-card-discover\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"Opens Discover filtered to this queue's metrics on QueueName.\"},\"hide_border\":true,\"drilldowns\":[{\"encode_url\":false,\"label\":\"View metrics in Discover\",\"open_in_new_tab\":true,\"trigger\":\"on_click_value\",\"type\":\"url_drilldown\",\"url\":\"{{kibanaUrl}}/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'{{context.panel.timeRange.from}}',to:'{{context.panel.timeRange.to}}'))&_a=(dataSource:(dataViewId:'metrics-*',type:dataView),filters:!((meta:(alias:!n,disabled:!f,index:'metrics-*',key:QueueName,negate:!f,params:(query:'{{event.value}}'),type:phrase),query:(match_phrase:(QueueName:'{{event.value}}')))),interval:auto,query:(language:kuery,query:''),sort:!(!('@timestamp',desc)))\"}]},\"panelIndex\":\"sqsid-card-discover\",\"gridData\":{\"y\":0,\"x\":27,\"w\":8,\"h\":3,\"i\":\"sqsid-card-discover\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"description\":\"Opens this queue's page in the AWS SQS console.\",\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"layerId\":\"lid-card-console\",\"layerType\":\"data\",\"metricAccessor\":\"col-card-console\",\"showBar\":false,\"colorMode\":\"background\",\"primaryAlign\":\"center\",\"valueFontMode\":\"fit\",\"primaryPosition\":\"bottom\",\"titlesTextAlign\":\"center\",\"applyColorTo\":\"background\",\"color\":\"#61a2ff00\",\"icon\":\"popout\",\"iconAlign\":\"left\",\"valuesTextSize\":\"xs\",\"titlesTextSize\":\"xxs\"},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS queue = MAX(QueueName)\\n| KEEP queue\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-card-console\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS queue = MAX(QueueName)\\n| KEEP queue\"},\"columns\":[{\"fieldName\":\"queue\",\"columnId\":\"col-card-console\",\"label\":\"View in AWS console\",\"customLabel\":true,\"meta\":{\"type\":\"string\",\"esType\":\"keyword\",\"sourceParams\":{\"indexPattern\":\"metrics-*\",\"sourceField\":\"QueueName\"},\"params\":{\"id\":\"string\"}},\"inMetricDimension\":true}],\"allColumns\":[{\"fieldName\":\"queue\",\"columnId\":\"col-card-console\",\"label\":\"View in AWS console\",\"customLabel\":true,\"meta\":{\"type\":\"string\",\"esType\":\"keyword\",\"sourceParams\":{\"indexPattern\":\"metrics-*\",\"sourceField\":\"QueueName\"},\"params\":{\"id\":\"string\"}},\"inMetricDimension\":true}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-card-console\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"Opens this queue's page in the AWS SQS console.\"},\"hide_border\":true,\"drilldowns\":[{\"label\":\"View in AWS console\",\"encode_url\":false,\"open_in_new_tab\":true,\"trigger\":\"on_click_value\",\"type\":\"url_drilldown\",\"url\":\"https://console.aws.amazon.com/sqs/v3/home\"}]},\"panelIndex\":\"sqsid-card-aws-console\",\"gridData\":{\"y\":0,\"x\":35,\"w\":6,\"h\":3,\"i\":\"sqsid-card-aws-console\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"description\":\"SQS queue status: Stale (oldest message age > 300 s), Backlogged (depth > 1000), or Healthy.\",\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"layerId\":\"lid-hdr-status\",\"layerType\":\"data\",\"metricAccessor\":\"col-hdr-status\",\"showBar\":false,\"colorMode\":\"none\",\"primaryAlign\":\"left\",\"valueFontMode\":\"fit\",\"primaryPosition\":\"bottom\",\"titlesTextAlign\":\"left\"},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Maximum\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS age = MAX(`metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`),\\n depth = MAX(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`)\\n| EVAL status = CASE(depth > 1000, \\\"Backlogged\\\", age > 300, \\\"Stale\\\", \\\"Healthy\\\")\\n| KEEP status\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-hdr-status\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Maximum\\\"\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS age = MAX(`metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`),\\n depth = MAX(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`)\\n| EVAL status = CASE(depth > 1000, \\\"Backlogged\\\", age > 300, \\\"Stale\\\", \\\"Healthy\\\")\\n| KEEP status\"},\"columns\":[{\"fieldName\":\"status\",\"columnId\":\"col-hdr-status\",\"label\":\"Status\",\"customLabel\":true,\"meta\":{\"type\":\"keyword\",\"esType\":\"keyword\"},\"inMetricDimension\":true}],\"allColumns\":[{\"fieldName\":\"status\",\"columnId\":\"col-hdr-status\",\"label\":\"Status\",\"customLabel\":true,\"meta\":{\"type\":\"keyword\",\"esType\":\"keyword\"},\"inMetricDimension\":true}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-hdr-status\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"SQS queue status: Stale (oldest message age > 300 s), Backlogged (depth > 1000), or Healthy.\"}},\"panelIndex\":\"sqsid-hdr-status\",\"gridData\":{\"y\":0,\"x\":41,\"w\":7,\"h\":3,\"i\":\"sqsid-hdr-status\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"Status timeline\",\"description\":\"3-state status timeline. Green = Healthy, amber = Backlogged (depth > 1000), red = Stale (age > 300 s).\",\"attributes\":{\"title\":\"Status timeline\",\"visualizationType\":\"lnsXY\",\"references\":[],\"state\":{\"visualization\":{\"preferredSeriesType\":\"bar_stacked\",\"legend\":{\"isVisible\":true,\"position\":\"bottom\",\"legendStats\":[],\"showSingleSeries\":true,\"layout\":\"list\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":false,\"yLeft\":false,\"yRight\":false},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":false,\"yRight\":false},\"gridlinesVisibilitySettings\":{\"x\":false,\"yLeft\":false,\"yRight\":false},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"yLeftScale\":\"linear\",\"layers\":[{\"layerId\":\"lid-status-timeline\",\"layerType\":\"data\",\"seriesType\":\"bar_stacked\",\"xAccessor\":\"col-stl-ts\",\"accessors\":[\"col-stl-healthy\",\"col-stl-backlogged\",\"col-stl-stale\"],\"showGridlines\":false,\"yConfig\":[{\"forAccessor\":\"col-stl-healthy\",\"color\":\"#24C292\",\"axisMode\":\"left\"},{\"forAccessor\":\"col-stl-backlogged\",\"color\":\"#F5A700\",\"axisMode\":\"left\"},{\"forAccessor\":\"col-stl-stale\",\"color\":\"#EE4C48\",\"axisMode\":\"left\"}]}]},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Maximum\\\" | STATS age = MAX(max_over_time(`metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`)), depth = MAX(max_over_time(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend) | EVAL age_v = COALESCE(age, 0), depth_v = COALESCE(depth, 0) | EVAL Backlogged = CASE(depth_v > 1000, 1, 0), Stale = CASE(depth_v <= 1000 AND age_v > 300, 1, 0), Healthy = CASE(depth_v <= 1000 AND age_v <= 300, 1, 0) | SORT timestamp ASC\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-status-timeline\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Maximum\\\" | STATS age = MAX(max_over_time(`metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`)), depth = MAX(max_over_time(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend) | EVAL age_v = COALESCE(age, 0), depth_v = COALESCE(depth, 0) | EVAL Backlogged = CASE(depth_v > 1000, 1, 0), Stale = CASE(depth_v <= 1000 AND age_v > 300, 1, 0), Healthy = CASE(depth_v <= 1000 AND age_v <= 300, 1, 0) | SORT timestamp ASC\"},\"columns\":[{\"columnId\":\"col-stl-ts\",\"fieldName\":\"timestamp\",\"meta\":{\"type\":\"date\",\"esType\":\"date\"}},{\"columnId\":\"col-stl-healthy\",\"fieldName\":\"Healthy\",\"label\":\"Healthy\",\"customLabel\":true,\"inMetricDimension\":true,\"meta\":{\"type\":\"number\",\"esType\":\"long\"}},{\"columnId\":\"col-stl-backlogged\",\"fieldName\":\"Backlogged\",\"label\":\"Backlogged\",\"customLabel\":true,\"inMetricDimension\":true,\"meta\":{\"type\":\"number\",\"esType\":\"long\"}},{\"columnId\":\"col-stl-stale\",\"fieldName\":\"Stale\",\"label\":\"Stale\",\"customLabel\":true,\"inMetricDimension\":true,\"meta\":{\"type\":\"number\",\"esType\":\"long\"}}],\"allColumns\":[{\"columnId\":\"col-stl-ts\",\"fieldName\":\"timestamp\",\"meta\":{\"type\":\"date\",\"esType\":\"date\"}},{\"columnId\":\"col-stl-healthy\",\"fieldName\":\"Healthy\",\"label\":\"Healthy\",\"customLabel\":true,\"inMetricDimension\":true,\"meta\":{\"type\":\"number\",\"esType\":\"long\"}},{\"columnId\":\"col-stl-backlogged\",\"fieldName\":\"Backlogged\",\"label\":\"Backlogged\",\"customLabel\":true,\"inMetricDimension\":true,\"meta\":{\"type\":\"number\",\"esType\":\"long\"}},{\"columnId\":\"col-stl-stale\",\"fieldName\":\"Stale\",\"label\":\"Stale\",\"customLabel\":true,\"inMetricDimension\":true,\"meta\":{\"type\":\"number\",\"esType\":\"long\"}}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-status-timeline\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"3-state status timeline. Green = Healthy, amber = Backlogged (depth > 1000), red = Stale (age > 300 s).\"}},\"panelIndex\":\"sqsid-status-timeline\",\"gridData\":{\"y\":3,\"x\":0,\"w\":48,\"h\":6,\"i\":\"sqsid-status-timeline\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"\",\"description\":\"Average messages sent per bucket over the selected range.\",\"hide_title\":true,\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"colorMode\":\"none\",\"layerId\":\"lid-sqsid-card-sent\",\"layerType\":\"data\",\"metricAccessor\":\"col-sqsid-card-sent-avg\",\"showBar\":false,\"titlesTextAlign\":\"left\",\"primaryAlign\":\"left\",\"primaryPosition\":\"top\",\"secondaryMetricAccessor\":\"col-sqsid-card-sent-last\",\"secondaryLabel\":\"Last value vs Avg\",\"secondaryLabelPosition\":\"before\",\"secondaryTrend\":{\"type\":\"dynamic\",\"visuals\":\"both\",\"paletteId\":\"compare_to\",\"reversed\":true,\"baselineValue\":\"primary\"}},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Sum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = SUM(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-sqsid-card-sent\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Sum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = SUM(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"columns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-sent-avg\",\"label\":\"Messages sent\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-sent-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"allColumns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-sent-avg\",\"label\":\"Messages sent\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-sent-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-sqsid-card-sent\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"Average messages sent per bucket over the selected range.\"}},\"panelIndex\":\"sqsid-card-sent\",\"gridData\":{\"y\":9,\"x\":0,\"w\":8,\"h\":10,\"i\":\"sqsid-card-sent\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"Messages sent\",\"description\":\"Messages sent over time.\",\"attributes\":{\"title\":\"Messages sent\",\"visualizationType\":\"lnsXY\",\"references\":[],\"state\":{\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}},\"datasourceStates\":{\"textBased\":{\"layers\":{\"xy-layer-chart-sent\":{\"columns\":[{\"columnId\":\"timestamp\",\"fieldName\":\"timestamp\",\"meta\":{\"esType\":\"date\",\"type\":\"date\"}},{\"columnId\":\"QueueName\",\"fieldName\":\"QueueName\",\"meta\":{\"type\":\"string\"}},{\"columnId\":\"col_sent\",\"customLabel\":true,\"fieldName\":\"col_sent\",\"inMetricDimension\":true,\"label\":\"Messages sent\",\"meta\":{\"esType\":\"double\",\"type\":\"number\"},\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Sum\\\" AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent` IS NOT NULL | STATS col_sent = SUM(sum_over_time(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"timeField\":\"@timestamp\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"filters\":[],\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-xy-layer-chart-sent\",\"type\":\"index-pattern\"}],\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Sum\\\" AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent` IS NOT NULL | STATS col_sent = SUM(sum_over_time(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"visualization\":{\"axisTitlesVisibilitySettings\":{\"x\":false,\"yLeft\":false,\"yRight\":false},\"layers\":[{\"accessors\":[\"col_sent\"],\"layerId\":\"xy-layer-chart-sent\",\"layerType\":\"data\",\"seriesType\":\"area\",\"showGridlines\":false,\"splitAccessors\":[\"QueueName\"],\"xAccessor\":\"timestamp\",\"yConfig\":null}],\"legend\":{\"isVisible\":true,\"position\":\"bottom\",\"legendStats\":[\"min\",\"max\",\"average\",\"lastValue\"],\"showSingleSeries\":true},\"preferredSeriesType\":\"area\",\"valueLabels\":\"hide\",\"fillOpacity\":0.1}},\"version\":2,\"description\":\"Messages sent over time.\"}},\"panelIndex\":\"sqsid-chart-sent\",\"gridData\":{\"y\":9,\"x\":8,\"w\":16,\"h\":10,\"i\":\"sqsid-chart-sent\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"\",\"description\":\"Average messages deleted per bucket over the selected range.\",\"hide_title\":true,\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"colorMode\":\"none\",\"layerId\":\"lid-sqsid-card-deleted\",\"layerType\":\"data\",\"metricAccessor\":\"col-sqsid-card-deleted-avg\",\"showBar\":false,\"titlesTextAlign\":\"left\",\"primaryAlign\":\"left\",\"primaryPosition\":\"top\",\"secondaryMetricAccessor\":\"col-sqsid-card-deleted-last\",\"secondaryLabel\":\"Last value vs Avg\",\"secondaryLabelPosition\":\"before\",\"secondaryTrend\":{\"type\":\"dynamic\",\"visuals\":\"both\",\"paletteId\":\"compare_to\",\"reversed\":true,\"baselineValue\":\"primary\"}},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Sum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesDeleted` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = SUM(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesDeleted`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-sqsid-card-deleted\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Sum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesDeleted` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = SUM(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesDeleted`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"columns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-deleted-avg\",\"label\":\"Messages deleted\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-deleted-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"allColumns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-deleted-avg\",\"label\":\"Messages deleted\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-deleted-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-sqsid-card-deleted\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"Average messages deleted per bucket over the selected range.\"}},\"panelIndex\":\"sqsid-card-deleted\",\"gridData\":{\"y\":9,\"x\":24,\"w\":8,\"h\":10,\"i\":\"sqsid-card-deleted\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"Messages deleted\",\"description\":\"Messages deleted over time.\",\"attributes\":{\"title\":\"Messages deleted\",\"visualizationType\":\"lnsXY\",\"references\":[],\"state\":{\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}},\"datasourceStates\":{\"textBased\":{\"layers\":{\"xy-layer-chart-deleted\":{\"columns\":[{\"columnId\":\"timestamp\",\"fieldName\":\"timestamp\",\"meta\":{\"esType\":\"date\",\"type\":\"date\"}},{\"columnId\":\"QueueName\",\"fieldName\":\"QueueName\",\"meta\":{\"type\":\"string\"}},{\"columnId\":\"col_deleted\",\"customLabel\":true,\"fieldName\":\"col_deleted\",\"inMetricDimension\":true,\"label\":\"Messages deleted\",\"meta\":{\"esType\":\"double\",\"type\":\"number\"},\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Sum\\\" AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesDeleted` IS NOT NULL | STATS col_deleted = SUM(sum_over_time(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesDeleted`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"timeField\":\"@timestamp\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"filters\":[],\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-xy-layer-chart-deleted\",\"type\":\"index-pattern\"}],\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Sum\\\" AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesDeleted` IS NOT NULL | STATS col_deleted = SUM(sum_over_time(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesDeleted`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"visualization\":{\"axisTitlesVisibilitySettings\":{\"x\":false,\"yLeft\":false,\"yRight\":false},\"layers\":[{\"accessors\":[\"col_deleted\"],\"layerId\":\"xy-layer-chart-deleted\",\"layerType\":\"data\",\"seriesType\":\"area\",\"showGridlines\":false,\"splitAccessors\":[\"QueueName\"],\"xAccessor\":\"timestamp\",\"yConfig\":null}],\"legend\":{\"isVisible\":true,\"position\":\"bottom\",\"legendStats\":[\"min\",\"max\",\"average\",\"lastValue\"],\"showSingleSeries\":true},\"preferredSeriesType\":\"area\",\"valueLabels\":\"hide\",\"fillOpacity\":0.1}},\"version\":2,\"description\":\"Messages deleted over time.\"}},\"panelIndex\":\"sqsid-chart-deleted\",\"gridData\":{\"y\":9,\"x\":32,\"w\":16,\"h\":10,\"i\":\"sqsid-chart-deleted\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"\",\"description\":\"Average messages received per bucket over the selected range.\",\"hide_title\":true,\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"colorMode\":\"none\",\"layerId\":\"lid-sqsid-card-received\",\"layerType\":\"data\",\"metricAccessor\":\"col-sqsid-card-received-avg\",\"showBar\":false,\"titlesTextAlign\":\"left\",\"primaryAlign\":\"left\",\"primaryPosition\":\"top\",\"secondaryMetricAccessor\":\"col-sqsid-card-received-last\",\"secondaryLabel\":\"Last value vs Avg\",\"secondaryLabelPosition\":\"before\",\"secondaryTrend\":{\"type\":\"dynamic\",\"visuals\":\"both\",\"paletteId\":\"compare_to\",\"reversed\":true,\"baselineValue\":\"primary\"}},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Sum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesReceived` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = SUM(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesReceived`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-sqsid-card-received\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Sum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesReceived` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = SUM(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesReceived`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"columns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-received-avg\",\"label\":\"Messages received\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-received-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"allColumns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-received-avg\",\"label\":\"Messages received\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-received-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-sqsid-card-received\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"Average messages received per bucket over the selected range.\"}},\"panelIndex\":\"sqsid-card-received\",\"gridData\":{\"y\":19,\"x\":0,\"w\":8,\"h\":10,\"i\":\"sqsid-card-received\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"Messages received\",\"description\":\"Messages received over time.\",\"attributes\":{\"title\":\"Messages received\",\"visualizationType\":\"lnsXY\",\"references\":[],\"state\":{\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}},\"datasourceStates\":{\"textBased\":{\"layers\":{\"xy-layer-chart-received\":{\"columns\":[{\"columnId\":\"timestamp\",\"fieldName\":\"timestamp\",\"meta\":{\"esType\":\"date\",\"type\":\"date\"}},{\"columnId\":\"QueueName\",\"fieldName\":\"QueueName\",\"meta\":{\"type\":\"string\"}},{\"columnId\":\"col_received\",\"customLabel\":true,\"fieldName\":\"col_received\",\"inMetricDimension\":true,\"label\":\"Messages received\",\"meta\":{\"esType\":\"double\",\"type\":\"number\"},\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Sum\\\" AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesReceived` IS NOT NULL | STATS col_received = SUM(sum_over_time(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesReceived`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"timeField\":\"@timestamp\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"filters\":[],\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-xy-layer-chart-received\",\"type\":\"index-pattern\"}],\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Sum\\\" AND `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesReceived` IS NOT NULL | STATS col_received = SUM(sum_over_time(`metrics.amazonaws.com/AWS/SQS/NumberOfMessagesReceived`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"visualization\":{\"axisTitlesVisibilitySettings\":{\"x\":false,\"yLeft\":false,\"yRight\":false},\"layers\":[{\"accessors\":[\"col_received\"],\"layerId\":\"xy-layer-chart-received\",\"layerType\":\"data\",\"seriesType\":\"area\",\"showGridlines\":false,\"splitAccessors\":[\"QueueName\"],\"xAccessor\":\"timestamp\",\"yConfig\":null}],\"legend\":{\"isVisible\":true,\"position\":\"bottom\",\"legendStats\":[\"min\",\"max\",\"average\",\"lastValue\"],\"showSingleSeries\":true},\"preferredSeriesType\":\"area\",\"valueLabels\":\"hide\",\"fillOpacity\":0.1}},\"version\":2,\"description\":\"Messages received over time.\"}},\"panelIndex\":\"sqsid-chart-received\",\"gridData\":{\"y\":19,\"x\":8,\"w\":16,\"h\":10,\"i\":\"sqsid-chart-received\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"\",\"description\":\"Average empty receives per bucket over the selected range.\",\"hide_title\":true,\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"colorMode\":\"none\",\"layerId\":\"lid-sqsid-card-empty\",\"layerType\":\"data\",\"metricAccessor\":\"col-sqsid-card-empty-avg\",\"showBar\":false,\"titlesTextAlign\":\"left\",\"primaryAlign\":\"left\",\"primaryPosition\":\"top\",\"secondaryMetricAccessor\":\"col-sqsid-card-empty-last\",\"secondaryLabel\":\"Last value vs Avg\",\"secondaryLabelPosition\":\"before\",\"secondaryTrend\":{\"type\":\"dynamic\",\"visuals\":\"both\",\"paletteId\":\"compare_to\",\"reversed\":true,\"baselineValue\":\"primary\"}},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Sum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/NumberOfEmptyReceives` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = SUM(`metrics.amazonaws.com/AWS/SQS/NumberOfEmptyReceives`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-sqsid-card-empty\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Sum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/NumberOfEmptyReceives` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = SUM(`metrics.amazonaws.com/AWS/SQS/NumberOfEmptyReceives`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"columns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-empty-avg\",\"label\":\"Empty receives\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-empty-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"allColumns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-empty-avg\",\"label\":\"Empty receives\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-empty-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-sqsid-card-empty\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"Average empty receives per bucket over the selected range.\"}},\"panelIndex\":\"sqsid-card-empty\",\"gridData\":{\"y\":19,\"x\":24,\"w\":8,\"h\":10,\"i\":\"sqsid-card-empty\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"Empty receives\",\"description\":\"Empty receives over time.\",\"attributes\":{\"title\":\"Empty receives\",\"visualizationType\":\"lnsXY\",\"references\":[],\"state\":{\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}},\"datasourceStates\":{\"textBased\":{\"layers\":{\"xy-layer-chart-empty\":{\"columns\":[{\"columnId\":\"timestamp\",\"fieldName\":\"timestamp\",\"meta\":{\"esType\":\"date\",\"type\":\"date\"}},{\"columnId\":\"QueueName\",\"fieldName\":\"QueueName\",\"meta\":{\"type\":\"string\"}},{\"columnId\":\"col_empty\",\"customLabel\":true,\"fieldName\":\"col_empty\",\"inMetricDimension\":true,\"label\":\"Empty receives\",\"meta\":{\"esType\":\"double\",\"type\":\"number\"},\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Sum\\\" AND `metrics.amazonaws.com/AWS/SQS/NumberOfEmptyReceives` IS NOT NULL | STATS col_empty = SUM(sum_over_time(`metrics.amazonaws.com/AWS/SQS/NumberOfEmptyReceives`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"timeField\":\"@timestamp\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"filters\":[],\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-xy-layer-chart-empty\",\"type\":\"index-pattern\"}],\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Sum\\\" AND `metrics.amazonaws.com/AWS/SQS/NumberOfEmptyReceives` IS NOT NULL | STATS col_empty = SUM(sum_over_time(`metrics.amazonaws.com/AWS/SQS/NumberOfEmptyReceives`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"visualization\":{\"axisTitlesVisibilitySettings\":{\"x\":false,\"yLeft\":false,\"yRight\":false},\"layers\":[{\"accessors\":[\"col_empty\"],\"layerId\":\"xy-layer-chart-empty\",\"layerType\":\"data\",\"seriesType\":\"area\",\"showGridlines\":false,\"splitAccessors\":[\"QueueName\"],\"xAccessor\":\"timestamp\",\"yConfig\":null}],\"legend\":{\"isVisible\":true,\"position\":\"bottom\",\"legendStats\":[\"min\",\"max\",\"average\",\"lastValue\"],\"showSingleSeries\":true},\"preferredSeriesType\":\"area\",\"valueLabels\":\"hide\",\"fillOpacity\":0.1}},\"version\":2,\"description\":\"Empty receives over time.\"}},\"panelIndex\":\"sqsid-chart-empty\",\"gridData\":{\"y\":19,\"x\":32,\"w\":16,\"h\":10,\"i\":\"sqsid-chart-empty\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"\",\"description\":\"Maximum visible messages (queue depth) over the selected range.\",\"hide_title\":true,\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"colorMode\":\"none\",\"layerId\":\"lid-sqsid-card-visible\",\"layerType\":\"data\",\"metricAccessor\":\"col-sqsid-card-visible-avg\",\"showBar\":false,\"titlesTextAlign\":\"left\",\"primaryAlign\":\"left\",\"primaryPosition\":\"top\",\"secondaryMetricAccessor\":\"col-sqsid-card-visible-last\",\"secondaryLabel\":\"Last value vs Avg\",\"secondaryLabelPosition\":\"before\",\"secondaryTrend\":{\"type\":\"dynamic\",\"visuals\":\"both\",\"paletteId\":\"compare_to\",\"reversed\":true,\"baselineValue\":\"primary\"}},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Maximum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = MAX(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-sqsid-card-visible\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Maximum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = MAX(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"columns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-visible-avg\",\"label\":\"Queue depth (visible)\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-visible-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"allColumns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-visible-avg\",\"label\":\"Queue depth (visible)\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-visible-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-sqsid-card-visible\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"Maximum visible messages (queue depth) over the selected range.\"}},\"panelIndex\":\"sqsid-card-visible\",\"gridData\":{\"y\":29,\"x\":0,\"w\":8,\"h\":10,\"i\":\"sqsid-card-visible\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"Queue depth (visible)\",\"description\":\"Queue depth (visible) over time.\",\"attributes\":{\"title\":\"Queue depth (visible)\",\"visualizationType\":\"lnsXY\",\"references\":[],\"state\":{\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}},\"datasourceStates\":{\"textBased\":{\"layers\":{\"xy-layer-chart-visible\":{\"columns\":[{\"columnId\":\"timestamp\",\"fieldName\":\"timestamp\",\"meta\":{\"esType\":\"date\",\"type\":\"date\"}},{\"columnId\":\"QueueName\",\"fieldName\":\"QueueName\",\"meta\":{\"type\":\"string\"}},{\"columnId\":\"col_visible\",\"customLabel\":true,\"fieldName\":\"col_visible\",\"inMetricDimension\":true,\"label\":\"Queue depth (visible)\",\"meta\":{\"esType\":\"double\",\"type\":\"number\"},\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Maximum\\\" AND `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible` IS NOT NULL | STATS col_visible = MAX(max_over_time(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"timeField\":\"@timestamp\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"filters\":[],\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-xy-layer-chart-visible\",\"type\":\"index-pattern\"}],\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Maximum\\\" AND `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible` IS NOT NULL | STATS col_visible = MAX(max_over_time(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"visualization\":{\"axisTitlesVisibilitySettings\":{\"x\":false,\"yLeft\":false,\"yRight\":false},\"layers\":[{\"accessors\":[\"col_visible\"],\"layerId\":\"xy-layer-chart-visible\",\"layerType\":\"data\",\"seriesType\":\"area\",\"showGridlines\":false,\"splitAccessors\":[\"QueueName\"],\"xAccessor\":\"timestamp\",\"yConfig\":null}],\"legend\":{\"isVisible\":true,\"position\":\"bottom\",\"legendStats\":[\"min\",\"max\",\"average\",\"lastValue\"],\"showSingleSeries\":true},\"preferredSeriesType\":\"area\",\"valueLabels\":\"hide\",\"fillOpacity\":0.1}},\"version\":2,\"description\":\"Queue depth (visible) over time.\"}},\"panelIndex\":\"sqsid-chart-visible\",\"gridData\":{\"y\":29,\"x\":8,\"w\":16,\"h\":10,\"i\":\"sqsid-chart-visible\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"\",\"description\":\"Maximum in-flight (not visible) messages over the selected range.\",\"hide_title\":true,\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"colorMode\":\"none\",\"layerId\":\"lid-sqsid-card-inflight\",\"layerType\":\"data\",\"metricAccessor\":\"col-sqsid-card-inflight-avg\",\"showBar\":false,\"titlesTextAlign\":\"left\",\"primaryAlign\":\"left\",\"primaryPosition\":\"top\",\"secondaryMetricAccessor\":\"col-sqsid-card-inflight-last\",\"secondaryLabel\":\"Last value vs Avg\",\"secondaryLabelPosition\":\"before\",\"secondaryTrend\":{\"type\":\"dynamic\",\"visuals\":\"both\",\"paletteId\":\"compare_to\",\"reversed\":true,\"baselineValue\":\"primary\"}},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Maximum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesNotVisible` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = MAX(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesNotVisible`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-sqsid-card-inflight\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Maximum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesNotVisible` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = MAX(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesNotVisible`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend)\\n| SORT timestamp\\n| STATS avg_value = AVG(v),\\n last_value = LAST(v, timestamp)\\n| KEEP avg_value, last_value\"},\"columns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-inflight-avg\",\"label\":\"In-flight messages\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-inflight-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"allColumns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-inflight-avg\",\"label\":\"In-flight messages\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-inflight-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-sqsid-card-inflight\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"Maximum in-flight (not visible) messages over the selected range.\"}},\"panelIndex\":\"sqsid-card-inflight\",\"gridData\":{\"y\":29,\"x\":24,\"w\":8,\"h\":10,\"i\":\"sqsid-card-inflight\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"In-flight messages\",\"description\":\"In-flight messages over time.\",\"attributes\":{\"title\":\"In-flight messages\",\"visualizationType\":\"lnsXY\",\"references\":[],\"state\":{\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}},\"datasourceStates\":{\"textBased\":{\"layers\":{\"xy-layer-chart-inflight\":{\"columns\":[{\"columnId\":\"timestamp\",\"fieldName\":\"timestamp\",\"meta\":{\"esType\":\"date\",\"type\":\"date\"}},{\"columnId\":\"QueueName\",\"fieldName\":\"QueueName\",\"meta\":{\"type\":\"string\"}},{\"columnId\":\"col_inflight\",\"customLabel\":true,\"fieldName\":\"col_inflight\",\"inMetricDimension\":true,\"label\":\"In-flight messages\",\"meta\":{\"esType\":\"double\",\"type\":\"number\"},\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Maximum\\\" AND `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesNotVisible` IS NOT NULL | STATS col_inflight = MAX(max_over_time(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesNotVisible`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"timeField\":\"@timestamp\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"filters\":[],\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-xy-layer-chart-inflight\",\"type\":\"index-pattern\"}],\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Maximum\\\" AND `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesNotVisible` IS NOT NULL | STATS col_inflight = MAX(max_over_time(`metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesNotVisible`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"visualization\":{\"axisTitlesVisibilitySettings\":{\"x\":false,\"yLeft\":false,\"yRight\":false},\"layers\":[{\"accessors\":[\"col_inflight\"],\"layerId\":\"xy-layer-chart-inflight\",\"layerType\":\"data\",\"seriesType\":\"area\",\"showGridlines\":false,\"splitAccessors\":[\"QueueName\"],\"xAccessor\":\"timestamp\",\"yConfig\":null}],\"legend\":{\"isVisible\":true,\"position\":\"bottom\",\"legendStats\":[\"min\",\"max\",\"average\",\"lastValue\"],\"showSingleSeries\":true},\"preferredSeriesType\":\"area\",\"valueLabels\":\"hide\",\"fillOpacity\":0.1}},\"version\":2,\"description\":\"In-flight messages over time.\"}},\"panelIndex\":\"sqsid-chart-inflight\",\"gridData\":{\"y\":29,\"x\":32,\"w\":16,\"h\":10,\"i\":\"sqsid-chart-inflight\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"\",\"description\":\"Maximum age of the oldest message in the queue (seconds).\",\"hide_title\":true,\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"references\":[],\"state\":{\"visualization\":{\"colorMode\":\"none\",\"layerId\":\"lid-sqsid-card-age\",\"layerType\":\"data\",\"metricAccessor\":\"col-sqsid-card-age-avg\",\"showBar\":false,\"titlesTextAlign\":\"left\",\"primaryAlign\":\"left\",\"primaryPosition\":\"top\",\"secondaryMetricAccessor\":\"col-sqsid-card-age-last\",\"secondaryLabel\":\"Last value vs Avg\",\"secondaryLabelPosition\":\"before\",\"secondaryTrend\":{\"type\":\"dynamic\",\"visuals\":\"both\",\"paletteId\":\"compare_to\",\"reversed\":true,\"baselineValue\":\"primary\"}},\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Maximum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName, `cloud.region`\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = MAX(`metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend), QueueName, `cloud.region`\\n| SORT timestamp\\n| STATS sum_value = SUM(v) BY timestamp\\n| STATS avg_value = AVG(sum_value),\\n last_value = LAST(sum_value, timestamp)\\n| KEEP avg_value, last_value\"},\"filters\":[],\"datasourceStates\":{\"textBased\":{\"layers\":{\"lid-sqsid-card-age\":{\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nFROM metrics-aws.sqs.otel-*\\n| WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\"\\n AND stat == \\\"Maximum\\\"\\n AND `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage` IS NOT NULL\\n| INLINE STATS queue_last = MAX(@timestamp) BY QueueName, `cloud.region`\\n| INLINE STATS latest_global = MAX(@timestamp)\\n| WHERE DATE_DIFF(\\\"minutes\\\", queue_last, latest_global) <= 5\\n| STATS v = MAX(`metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`) BY timestamp = BUCKET(@timestamp, 50, ?_tstart, ?_tend), QueueName, `cloud.region`\\n| SORT timestamp\\n| STATS sum_value = SUM(v) BY timestamp\\n| STATS avg_value = AVG(sum_value),\\n last_value = LAST(sum_value, timestamp)\\n| KEEP avg_value, last_value\"},\"columns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-age-avg\",\"label\":\"Oldest message age (s)\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-age-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"allColumns\":[{\"fieldName\":\"avg_value\",\"columnId\":\"col-sqsid-card-age-avg\",\"label\":\"Oldest message age (s)\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}},{\"fieldName\":\"last_value\",\"columnId\":\"col-sqsid-card-age-last\",\"label\":\"Last value\",\"customLabel\":true,\"meta\":{\"type\":\"number\",\"esType\":\"double\"},\"inMetricDimension\":true,\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"timeField\":\"@timestamp\",\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-lid-sqsid-card-age\",\"type\":\"index-pattern\"}],\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}}},\"version\":2,\"description\":\"Maximum age of the oldest message in the queue (seconds).\"}},\"panelIndex\":\"sqsid-card-age\",\"gridData\":{\"y\":39,\"x\":0,\"w\":8,\"h\":10,\"i\":\"sqsid-card-age\"}},{\"type\":\"vis\",\"embeddableConfig\":{\"title\":\"Oldest message age (s)\",\"description\":\"Oldest message age (s) over time.\",\"attributes\":{\"title\":\"Oldest message age (s)\",\"visualizationType\":\"lnsXY\",\"references\":[],\"state\":{\"adHocDataViews\":{\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\":{\"allowHidden\":false,\"allowNoIndex\":true,\"fieldFormats\":{},\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"managed\":false,\"name\":\"metrics-aws.sqs.otel-*\",\"runtimeFieldMap\":{},\"sourceFilters\":[],\"timeFieldName\":\"@timestamp\",\"title\":\"metrics-aws.sqs.otel-*\",\"type\":\"esql\"}},\"datasourceStates\":{\"textBased\":{\"layers\":{\"xy-layer-chart-age\":{\"columns\":[{\"columnId\":\"timestamp\",\"fieldName\":\"timestamp\",\"meta\":{\"esType\":\"date\",\"type\":\"date\"}},{\"columnId\":\"QueueName\",\"fieldName\":\"QueueName\",\"meta\":{\"type\":\"string\"}},{\"columnId\":\"col_age\",\"customLabel\":true,\"fieldName\":\"col_age\",\"inMetricDimension\":true,\"label\":\"Oldest message age (s)\",\"meta\":{\"esType\":\"double\",\"type\":\"number\"},\"params\":{\"format\":{\"id\":\"number\",\"params\":{\"decimals\":1}}}}],\"index\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Maximum\\\" AND `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage` IS NOT NULL | STATS col_age = MAX(max_over_time(`metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"timeField\":\"@timestamp\"}},\"indexPatternRefs\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"title\":\"metrics-aws.sqs.otel-*\",\"timeField\":\"@timestamp\"}]}},\"filters\":[],\"internalReferences\":[{\"id\":\"7a6bd5dcca7409fc7fbfbf101315b4ead1c5b53c88097cebc107a6df71779492\",\"name\":\"indexpattern-datasource-layer-xy-layer-chart-age\",\"type\":\"index-pattern\"}],\"query\":{\"esql\":\"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat == \\\"Maximum\\\" AND `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage` IS NOT NULL | STATS col_age = MAX(max_over_time(`metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`)) BY timestamp = TBUCKET(50, ?_tstart, ?_tend), QueueName, cloud.region | SORT timestamp ASC\"},\"visualization\":{\"axisTitlesVisibilitySettings\":{\"x\":false,\"yLeft\":false,\"yRight\":false},\"layers\":[{\"accessors\":[\"col_age\"],\"layerId\":\"xy-layer-chart-age\",\"layerType\":\"data\",\"seriesType\":\"area\",\"showGridlines\":false,\"splitAccessors\":[\"QueueName\"],\"xAccessor\":\"timestamp\",\"yConfig\":null}],\"legend\":{\"isVisible\":true,\"position\":\"bottom\",\"legendStats\":[\"min\",\"max\",\"average\",\"lastValue\"],\"showSingleSeries\":true},\"preferredSeriesType\":\"area\",\"valueLabels\":\"hide\",\"fillOpacity\":0.1}},\"version\":2,\"description\":\"Oldest message age (s) over time.\"}},\"panelIndex\":\"sqsid-chart-age\",\"gridData\":{\"y\":39,\"x\":8,\"w\":40,\"h\":10,\"i\":\"sqsid-chart-age\"}}]", + "timeRestore": false, + "title": "[AWS OTel] SQS Queue Detail" + }, + "references": [ + { + "id": "metrics-*", + "name": "kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index", + "type": "index-pattern" + }, + { + "id": "aws_sqs_otel-b1c3d401-841f-43f1-9421-4afc51a2ec87", + "name": "sqsid-back-link:link_4a8b9c2d-3e5f-6071-8293-a4b5c6d7e8f9_dashboard", + "type": "dashboard" + } + ] +} diff --git a/packages/aws_sqs_otel/kibana/dashboard/aws_sqs_otel-b1c3d401-841f-43f1-9421-4afc51a2ec87.json b/packages/aws_sqs_otel/kibana/dashboard/aws_sqs_otel-b1c3d401-841f-43f1-9421-4afc51a2ec87.json index e60c93ef133..c03426ae823 100644 --- a/packages/aws_sqs_otel/kibana/dashboard/aws_sqs_otel-b1c3d401-841f-43f1-9421-4afc51a2ec87.json +++ b/packages/aws_sqs_otel/kibana/dashboard/aws_sqs_otel-b1c3d401-841f-43f1-9421-4afc51a2ec87.json @@ -537,7 +537,7 @@ }, "description": "One hexagon per SQS queue, ordered worst-first with stale or backlogged queues first. Toggle Color by between Status, Oldest Message Age, or Queue Depth; metric views support Min, Max, Avg, and Last over the dashboard time range. Click any hexagon to filter the dashboard or open metrics for that queue.", "params": { - "spec": "{\n \"$schema\": \"https://vega.github.io/schema/vega/v5.json\",\n \"description\": \"One hexagon per SQS queue, ordered worst-first with stale or backlogged queues first. States: stale (oldest message > 300 s), backlogged (depth > 1000), healthy (all other active queues), Unknown (no metric data). Toggle Color by between Status, Oldest Message Age, or Queue Depth; metric views support Min, Max, Avg, and Last over the dashboard time range. Click any hexagon to filter the dashboard or open metrics for that queue.\",\n \"usermeta\": {\n \"x_sqs_hexmap\": true\n },\n \"padding\": {\n \"top\": 10,\n \"left\": 10,\n \"right\": 10,\n \"bottom\": 15\n },\n \"data\": [\n {\n \"name\": \"ts_probe\",\n \"url\": {\n \"%type%\": \"esql\",\n \"%context%\": true,\n \"%timefield%\": \"@timestamp\",\n \"query\": \"ROW round_key = CONCAT(TO_STRING(?_tstart), \\\"|\\\", TO_STRING(?_tend)), fetched_at = NOW()\"\n }\n },\n {\n \"name\": \"raw_all\",\n \"url\": {\n \"%type%\": \"esql\",\n \"%context%\": true,\n \"%timefield%\": \"@timestamp\",\n \"query\": \"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE @timestamp >= ?_tstart AND @timestamp <= ?_tend\\n AND QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat IN (\\\"Average\\\", \\\"Maximum\\\", \\\"Sum\\\") | STATS age_min = MIN(MIN_OVER_TIME(CASE(stat == \\\"Average\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`, NULL))), age_max = MAX(MAX_OVER_TIME(CASE(stat == \\\"Maximum\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`, NULL))), age_avg = AVG(AVG_OVER_TIME(CASE(stat == \\\"Average\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`, NULL))), age_last = MAX(LAST_OVER_TIME(CASE(stat == \\\"Maximum\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`, NULL))), depth_min = MIN(MIN_OVER_TIME(CASE(stat == \\\"Average\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`, NULL))), depth_max = MAX(MAX_OVER_TIME(CASE(stat == \\\"Maximum\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`, NULL))), depth_avg = AVG(AVG_OVER_TIME(CASE(stat == \\\"Average\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`, NULL))), depth_last = MAX(LAST_OVER_TIME(CASE(stat == \\\"Maximum\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`, NULL))), sent_total = SUM(SUM_OVER_TIME(CASE(stat == \\\"Sum\\\", `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent`, NULL))), sent_last = MAX(LAST_OVER_TIME(CASE(stat == \\\"Sum\\\", `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent`, NULL))) BY entity_id = QueueName, cloud.region | EVAL status_num = CASE(\\n age_last IS NULL AND depth_last IS NULL AND sent_last IS NULL, 3,\\n depth_last > 1000, 1,\\n age_last > 300, 0,\\n 2),\\n status_label = CASE(\\n age_last IS NULL AND depth_last IS NULL AND sent_last IS NULL, \\\"Unknown\\\",\\n depth_last > 1000, \\\"backlogged\\\",\\n age_last > 300, \\\"stale\\\",\\n \\\"healthy\\\"),\\n severity_rank = status_num,\\n round_key = CONCAT(TO_STRING(?_tstart), \\\"|\\\", TO_STRING(?_tend)),\\n fetched_at = NOW()\\n| KEEP entity_id, status_num, status_label, severity_rank,\\n age_min, age_max, age_avg, age_last,\\n depth_min, depth_max, depth_avg, depth_last,\\n round_key, fetched_at\\n| LIMIT 10000\"\n }\n },\n {\n \"name\": \"ranked_status\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"severity_rank\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_age_min\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.age_min == null ? 1e12 : -datum.age_min * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_age_max\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.age_max == null ? 1e12 : -datum.age_max * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_age_avg\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.age_avg == null ? 1e12 : -datum.age_avg * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_age_last\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.age_last == null ? 1e12 : -datum.age_last * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_depth_min\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.depth_min == null ? 1e12 : -datum.depth_min * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_depth_max\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.depth_max == null ? 1e12 : -datum.depth_max * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_depth_avg\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.depth_avg == null ? 1e12 : -datum.depth_avg * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_depth_last\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.depth_last == null ? 1e12 : -datum.depth_last * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"active\",\n \"values\": [],\n \"on\": [\n {\n \"trigger\": \"ts_round !== '' && active_round !== '' && active_round !== ts_round\",\n \"remove\": \"true\"\n },\n {\n \"trigger\": \"metric === 'status' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_status')\"\n },\n {\n \"trigger\": \"metric === 'age' && effective_agg === 'min' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_age_min')\"\n },\n {\n \"trigger\": \"metric === 'age' && effective_agg === 'max' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_age_max')\"\n },\n {\n \"trigger\": \"metric === 'age' && effective_agg === 'avg' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_age_avg')\"\n },\n {\n \"trigger\": \"metric === 'age' && effective_agg === 'last' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_age_last')\"\n },\n {\n \"trigger\": \"metric === 'depth' && effective_agg === 'min' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_depth_min')\"\n },\n {\n \"trigger\": \"metric === 'depth' && effective_agg === 'max' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_depth_max')\"\n },\n {\n \"trigger\": \"metric === 'depth' && effective_agg === 'avg' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_depth_avg')\"\n },\n {\n \"trigger\": \"metric === 'depth' && effective_agg === 'last' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_depth_last')\"\n }\n ]\n },\n {\n \"name\": \"entities\",\n \"source\": \"active\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"active_val\",\n \"expr\": \"metric=='status' ? null : (metric=='age' ? (effective_agg=='min' ? datum.age_min : effective_agg=='max' ? datum.age_max : effective_agg=='avg' ? datum.age_avg : effective_agg=='last' ? datum.age_last : null) : (metric=='depth' ? (effective_agg=='min' ? datum.depth_min : effective_agg=='max' ? datum.depth_max : effective_agg=='avg' ? datum.depth_avg : effective_agg=='last' ? datum.depth_last : null) : null))\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"index0\",\n \"expr\": \"datum.active_rank - 1\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"col\",\n \"expr\": \"datum.index0 % gridCols\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"row\",\n \"expr\": \"floor(datum.index0 / gridCols)\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"x\",\n \"expr\": \"datum.col * gapX + (datum.row % 2 == 1 ? gapX / 2 : 0) + hexR + 5\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"y\",\n \"expr\": \"datum.row * gapY + hexR + 5 + hexOffsetY\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"hexSize\",\n \"expr\": \"hexR * hexR * 3.46\"\n }\n ]\n },\n {\n \"name\": \"status_counts\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"aggregate\",\n \"groupby\": [\n \"status_num\"\n ],\n \"ops\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ]\n }\n ]\n },\n {\n \"name\": \"status_legend\",\n \"values\": [\n {\n \"label\": \"Stale\",\n \"val\": 0\n },\n {\n \"label\": \"Backlogged\",\n \"val\": 1\n },\n {\n \"label\": \"Healthy\",\n \"val\": 2\n },\n {\n \"label\": \"Unknown\",\n \"val\": 3\n }\n ],\n \"transform\": [\n {\n \"type\": \"lookup\",\n \"from\": \"status_counts\",\n \"key\": \"status_num\",\n \"fields\": [\n \"val\"\n ],\n \"values\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ],\n \"default\": 0\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"idx\"\n ]\n }\n ]\n },\n {\n \"name\": \"age_counts\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"v\",\n \"expr\": \"agg == 'min' ? datum.age_min : agg == 'max' ? datum.age_max : agg == 'avg' ? datum.age_avg : agg == 'last' ? datum.age_last : null\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"bucket\",\n \"expr\": \"datum.v == null ? 3 : (datum.v >= 300 ? 2 : datum.v >= 60 ? 1 : 0)\"\n },\n {\n \"type\": \"aggregate\",\n \"groupby\": [\n \"bucket\"\n ],\n \"ops\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ]\n }\n ]\n },\n {\n \"name\": \"depth_counts\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"v\",\n \"expr\": \"agg == 'min' ? datum.depth_min : agg == 'max' ? datum.depth_max : agg == 'avg' ? datum.depth_avg : agg == 'last' ? datum.depth_last : null\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"bucket\",\n \"expr\": \"datum.v == null ? 3 : (datum.v >= 1000 ? 2 : datum.v >= 100 ? 1 : 0)\"\n },\n {\n \"type\": \"aggregate\",\n \"groupby\": [\n \"bucket\"\n ],\n \"ops\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ]\n }\n ]\n },\n {\n \"name\": \"age_legend_stops\",\n \"values\": [\n {\n \"label\": \"≥ 300 s\",\n \"val\": 600,\n \"bucket\": 2,\n \"is_nodata\": false\n },\n {\n \"label\": \"60 – 299 s\",\n \"val\": 120,\n \"bucket\": 1,\n \"is_nodata\": false\n },\n {\n \"label\": \"< 60 s\",\n \"val\": 10,\n \"bucket\": 0,\n \"is_nodata\": false\n },\n {\n \"label\": \"Unknown\",\n \"val\": null,\n \"bucket\": 3,\n \"is_nodata\": true\n }\n ],\n \"transform\": [\n {\n \"type\": \"lookup\",\n \"from\": \"age_counts\",\n \"key\": \"bucket\",\n \"fields\": [\n \"bucket\"\n ],\n \"values\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ],\n \"default\": 0\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"idx\"\n ]\n }\n ]\n },\n {\n \"name\": \"depth_legend_stops\",\n \"values\": [\n {\n \"label\": \"≥ 1000\",\n \"val\": 5000,\n \"bucket\": 2,\n \"is_nodata\": false\n },\n {\n \"label\": \"100 – 999\",\n \"val\": 500,\n \"bucket\": 1,\n \"is_nodata\": false\n },\n {\n \"label\": \"< 100\",\n \"val\": 10,\n \"bucket\": 0,\n \"is_nodata\": false\n },\n {\n \"label\": \"Unknown\",\n \"val\": null,\n \"bucket\": 3,\n \"is_nodata\": true\n }\n ],\n \"transform\": [\n {\n \"type\": \"lookup\",\n \"from\": \"depth_counts\",\n \"key\": \"bucket\",\n \"fields\": [\n \"bucket\"\n ],\n \"values\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ],\n \"default\": 0\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"idx\"\n ]\n }\n ]\n },\n {\n \"name\": \"spinner_dots\",\n \"values\": [\n {\n \"i\": 0\n },\n {\n \"i\": 1\n },\n {\n \"i\": 2\n },\n {\n \"i\": 3\n },\n {\n \"i\": 4\n },\n {\n \"i\": 5\n },\n {\n \"i\": 6\n },\n {\n \"i\": 7\n }\n ]\n },\n {\n \"name\": \"pills\",\n \"values\": [\n {\n \"id\": \"status\",\n \"label\": \"Status\",\n \"group\": \"metric\",\n \"x\": 69,\n \"w\": 48,\n \"available_aggs\": [],\n \"default_agg\": \"last\"\n },\n {\n \"id\": \"age\",\n \"label\": \"Oldest age (s)\",\n \"group\": \"metric\",\n \"x\": 125,\n \"w\": 108,\n \"available_aggs\": [\n \"min\",\n \"max\",\n \"avg\",\n \"last\"\n ],\n \"default_agg\": \"last\"\n },\n {\n \"id\": \"depth\",\n \"label\": \"Depth\",\n \"group\": \"metric\",\n \"x\": 241,\n \"w\": 56,\n \"available_aggs\": [\n \"min\",\n \"max\",\n \"avg\",\n \"last\"\n ],\n \"default_agg\": \"last\"\n },\n {\n \"id\": \"min\",\n \"label\": \"Min\",\n \"group\": \"agg\",\n \"x\": 425,\n \"w\": 36,\n \"valid_for\": [\n \"age\",\n \"depth\"\n ]\n },\n {\n \"id\": \"max\",\n \"label\": \"Max\",\n \"group\": \"agg\",\n \"x\": 465,\n \"w\": 36,\n \"valid_for\": [\n \"age\",\n \"depth\"\n ]\n },\n {\n \"id\": \"avg\",\n \"label\": \"Avg\",\n \"group\": \"agg\",\n \"x\": 505,\n \"w\": 36,\n \"valid_for\": [\n \"age\",\n \"depth\"\n ]\n },\n {\n \"id\": \"last\",\n \"label\": \"Last\",\n \"group\": \"agg\",\n \"x\": 545,\n \"w\": 40,\n \"valid_for\": [\n \"age\",\n \"depth\"\n ]\n },\n {\n \"id\": \"sum\",\n \"label\": \"Sum\",\n \"group\": \"agg\",\n \"x\": 589,\n \"w\": 40,\n \"valid_for\": []\n }\n ]\n },\n {\n \"name\": \"menu_items_data\",\n \"values\": [\n {\n \"id\": \"filter\",\n \"label\": \"Filter dashboard by this queue\",\n \"idx\": 0\n },\n {\n \"id\": \"metrics\",\n \"label\": \"View queue metrics in Discover\",\n \"idx\": 1\n }\n ]\n },\n {\n \"name\": \"menu_visible\",\n \"values\": [\n {\n \"_\": 0\n }\n ],\n \"transform\": [\n {\n \"type\": \"filter\",\n \"expr\": \"selected_entity != null\"\n }\n ]\n },\n {\n \"name\": \"menu_items_visible\",\n \"source\": \"menu_items_data\",\n \"transform\": [\n {\n \"type\": \"filter\",\n \"expr\": \"selected_entity != null\"\n }\n ]\n }\n ],\n \"signals\": [\n {\n \"name\": \"metric\",\n \"value\": \"status\",\n \"on\": [\n {\n \"events\": \"@pill_bg:click\",\n \"update\": \"datum.group === 'metric' ? datum.id : metric\"\n }\n ]\n },\n {\n \"name\": \"agg\",\n \"value\": \"last\",\n \"on\": [\n {\n \"events\": \"@pill_bg:click\",\n \"update\": \"datum.group === 'agg' && metric !== 'status' && indexof(datum.valid_for, metric) >= 0 ? datum.id : ( datum.group === 'metric' && datum.id !== 'status' ? (indexof(datum.available_aggs, agg) >= 0 ? agg : datum.default_agg) : agg )\"\n }\n ]\n },\n {\n \"name\": \"effective_agg\",\n \"update\": \"metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'\"\n },\n {\n \"name\": \"groupHeaderH\",\n \"value\": 20\n },\n {\n \"name\": \"groupGap\",\n \"value\": 10\n },\n {\n \"name\": \"group_by\",\n \"value\": \"none\"\n },\n {\n \"name\": \"len_raw\",\n \"update\": \"length(data('raw_all'))\"\n },\n {\n \"name\": \"len_active\",\n \"update\": \"length(data('active'))\"\n },\n {\n \"name\": \"ts_round\",\n \"update\": \"data('ts_probe')[0] ? data('ts_probe')[0].round_key : ''\"\n },\n {\n \"name\": \"time_from\",\n \"update\": \"ts_round !== '' && indexof(ts_round, '|') > 0 ? slice(ts_round, 0, indexof(ts_round, '|')) : ''\"\n },\n {\n \"name\": \"time_to\",\n \"update\": \"ts_round !== '' && indexof(ts_round, '|') > 0 ? slice(ts_round, indexof(ts_round, '|') + 1) : ''\"\n },\n {\n \"name\": \"g_param\",\n \"update\": \"time_from !== '' && time_to !== '' ? '_g=(time:(from:%27' + time_from + '%27,to:%27' + time_to + '%27))&' : ''\"\n },\n {\n \"name\": \"raw_round\",\n \"update\": \"data('raw_all')[0] ? data('raw_all')[0].round_key : ''\"\n },\n {\n \"name\": \"active_round\",\n \"update\": \"raw_round\"\n },\n {\n \"name\": \"raw_fetched_str\",\n \"update\": \"data('raw_all')[0] ? data('raw_all')[0].fetched_at : ''\"\n },\n {\n \"name\": \"active_fetched\",\n \"update\": \"raw_fetched_str !== '' ? toDate(raw_fetched_str) : 0\"\n },\n {\n \"name\": \"tick\",\n \"value\": 0,\n \"on\": [\n {\n \"events\": {\n \"type\": \"timer\",\n \"throttle\": 100\n },\n \"update\": \"now()\"\n }\n ]\n },\n {\n \"name\": \"url_change_at\",\n \"value\": 0,\n \"on\": [\n {\n \"events\": {\n \"source\": \"window\",\n \"type\": \"hashchange\"\n },\n \"update\": \"now()\"\n },\n {\n \"events\": {\n \"source\": \"window\",\n \"type\": \"popstate\"\n },\n \"update\": \"now()\"\n }\n ]\n },\n {\n \"name\": \"fetch_tracker\",\n \"init\": \"{seen: 0, arrived_at: 0}\",\n \"on\": [\n {\n \"events\": {\n \"signal\": \"tick\"\n },\n \"update\": \"active_fetched > 0 && active_fetched !== fetch_tracker.seen ? {seen: active_fetched, arrived_at: tick} : fetch_tracker\"\n }\n ]\n },\n {\n \"name\": \"loading_raw\",\n \"update\": \"len_active === 0 || ts_round === '' || active_round === '' || active_round !== ts_round || (url_change_at > 0 && fetch_tracker.arrived_at < url_change_at)\"\n },\n {\n \"name\": \"loading_started_at\",\n \"value\": 0,\n \"on\": [\n {\n \"events\": {\n \"signal\": \"tick\"\n },\n \"update\": \"loading_raw ? (loading_started_at === 0 ? tick : loading_started_at) : 0\"\n }\n ]\n },\n {\n \"name\": \"loading_elapsed\",\n \"update\": \"loading_started_at > 0 ? tick - loading_started_at : 0\"\n },\n {\n \"name\": \"no_data\",\n \"update\": \"loading_raw && ts_round !== '' && len_raw === 0 && loading_elapsed > 2000\"\n },\n {\n \"name\": \"loading\",\n \"update\": \"loading_raw && !no_data\"\n },\n {\n \"name\": \"loading_timeout\",\n \"update\": \"loading && loading_elapsed > 15000\"\n },\n {\n \"name\": \"total_entities\",\n \"update\": \"len_raw\"\n },\n {\n \"name\": \"legendW\",\n \"value\": 138\n },\n {\n \"name\": \"buttonsH\",\n \"value\": 34\n },\n {\n \"name\": \"availW\",\n \"update\": \"width - 20 - legendW\"\n },\n {\n \"name\": \"n_groups\",\n \"value\": 0\n },\n {\n \"name\": \"availH\",\n \"update\": \"height - 20 - buttonsH - (group_by !== 'none' ? n_groups * (groupHeaderH + groupGap) : 0)\"\n },\n {\n \"name\": \"hexOffsetY\",\n \"update\": \"buttonsH\"\n },\n {\n \"name\": \"idealCols\",\n \"update\": \"total_entities > 0 && availH > 0 ? max(1, round(sqrt(total_entities * (availW / availH)))) : 1\"\n },\n {\n \"name\": \"idealRows\",\n \"update\": \"max(1, ceil(total_entities / idealCols))\"\n },\n {\n \"name\": \"hexRInitial\",\n \"update\": \"min(availW / (idealCols * 2 + 0), availH / (idealRows * 2 + 0))\"\n },\n {\n \"name\": \"maxColsAtHexR\",\n \"update\": \"max(idealCols, floor(availW / (max(3, hexRInitial) * 2)))\"\n },\n {\n \"name\": \"maxColsAtMinR\",\n \"update\": \"max(1, floor(availW / (3 * 2)))\"\n },\n {\n \"name\": \"gridCols\",\n \"update\": \"max(1, min(total_entities, min(maxColsAtHexR, maxColsAtMinR)))\"\n },\n {\n \"name\": \"gridRows\",\n \"update\": \"group_by === 'none' ? max(1, ceil(total_entities / gridCols)) : max(1, ceil(total_entities / gridCols) + max(0, n_groups - 1))\"\n },\n {\n \"name\": \"rByWidth\",\n \"update\": \"availW / (gridCols * 1.76 + 0.88)\"\n },\n {\n \"name\": \"rByHeight\",\n \"update\": \"availH / (gridRows * 1.54 + 0.92)\"\n },\n {\n \"name\": \"hexR\",\n \"update\": \"max(3, min(90, min(rByWidth, rByHeight)))\"\n },\n {\n \"name\": \"gapX\",\n \"update\": \"hexR * 1.76\"\n },\n {\n \"name\": \"gapY\",\n \"update\": \"hexR * 1.54\"\n },\n {\n \"name\": \"legendX\",\n \"update\": \"width - legendW + 4\"\n },\n {\n \"name\": \"tooltip\",\n \"value\": {},\n \"on\": [\n {\n \"events\": \"@hexagons:mouseover\",\n \"update\": \"datum\"\n },\n {\n \"events\": \"@hexagons:mouseout\",\n \"update\": \"{}\"\n }\n ]\n },\n {\n \"name\": \"selected_entity\",\n \"value\": null,\n \"on\": [\n {\n \"events\": \"@hexagons:click\",\n \"update\": \"{id: datum.entity_id, x: datum.x, y: datum.y}\"\n },\n {\n \"events\": \"@menu_backdrop:click\",\n \"update\": \"null\"\n },\n {\n \"events\": \"@menu_item_bg:click\",\n \"update\": \"null\"\n }\n ]\n },\n {\n \"name\": \"menu_x\",\n \"update\": \"selected_entity ? ((selected_entity.x + hexR + 4 + 248 > width - legendW - 4) ? max(4, selected_entity.x - hexR - 248 - 4) : max(4, selected_entity.x + hexR + 4)) : 0\"\n },\n {\n \"name\": \"menu_y\",\n \"update\": \"selected_entity ? max(buttonsH + 4, min(selected_entity.y - 75, height - 90 - 4)) : 0\"\n }\n ],\n \"scales\": [\n {\n \"name\": \"status_color\",\n \"type\": \"ordinal\",\n \"domain\": [\n 0,\n 1,\n 2,\n 3\n ],\n \"range\": [\n \"#F6726A\",\n \"#D6BF57\",\n \"#24C292\",\n \"#BFDBFF\"\n ]\n },\n {\n \"name\": \"age_color\",\n \"type\": \"threshold\",\n \"domain\": [\n 60,\n 300\n ],\n \"range\": [\n \"#24C292\",\n \"#D6BF57\",\n \"#F6726A\"\n ]\n },\n {\n \"name\": \"depth_color\",\n \"type\": \"threshold\",\n \"domain\": [\n 100,\n 1000\n ],\n \"range\": [\n \"#24C292\",\n \"#D6BF57\",\n \"#F6726A\"\n ]\n }\n ],\n \"marks\": [\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 5\n },\n \"y\": {\n \"value\": 17\n },\n \"text\": {\n \"value\": \"Color by:\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": 600\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 345\n },\n \"y\": {\n \"value\": 17\n },\n \"text\": {\n \"value\": \"Aggregation:\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": 600\n },\n \"fill\": {\n \"value\": \"#838C99\"\n },\n \"opacity\": {\n \"signal\": \"(metric === 'age' || metric === 'depth') ? 1 : 0.5\"\n }\n }\n }\n },\n {\n \"name\": \"pill_bg\",\n \"type\": \"rect\",\n \"from\": {\n \"data\": \"pills\"\n },\n \"encode\": {\n \"enter\": {},\n \"update\": {\n \"x\": {\n \"field\": \"x\"\n },\n \"x2\": {\n \"signal\": \"datum.x + datum.w\"\n },\n \"y\": {\n \"value\": 6\n },\n \"y2\": {\n \"value\": 28\n },\n \"cornerRadius\": {\n \"value\": 4\n },\n \"fill\": {\n \"signal\": \"((datum.group === 'metric' && datum.id === metric) || (datum.group === 'agg' && datum.id === effective_agg)) ? '#0077CC' : 'transparent'\"\n },\n \"stroke\": {\n \"signal\": \"((datum.group === 'metric' && datum.id === metric) || (datum.group === 'agg' && datum.id === effective_agg)) ? '#0064B0' : '#838C99'\"\n },\n \"strokeWidth\": {\n \"value\": 1\n },\n \"opacity\": {\n \"signal\": \"(datum.group === 'agg' && (!(metric === 'age' || metric === 'depth') || indexof(datum.valid_for, metric) < 0)) ? 0.5 : 1\"\n },\n \"cursor\": {\n \"signal\": \"(datum.group === 'agg' && (!(metric === 'age' || metric === 'depth') || indexof(datum.valid_for, metric) < 0)) ? 'default' : 'pointer'\"\n }\n }\n }\n },\n {\n \"name\": \"pill_label\",\n \"type\": \"text\",\n \"interactive\": false,\n \"from\": {\n \"data\": \"pills\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"datum.x + datum.w / 2\"\n },\n \"y\": {\n \"value\": 17\n },\n \"text\": {\n \"field\": \"label\"\n },\n \"align\": {\n \"value\": \"center\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": 500\n },\n \"fill\": {\n \"signal\": \"((datum.group === 'metric' && datum.id === metric) || (datum.group === 'agg' && datum.id === effective_agg)) ? '#FFFFFF' : '#838C99'\"\n },\n \"opacity\": {\n \"signal\": \"(datum.group === 'agg' && (!(metric === 'age' || metric === 'depth') || indexof(datum.valid_for, metric) < 0)) ? 0.5 : 1\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"width - legendW - 4\"\n },\n \"y\": {\n \"value\": 17\n },\n \"text\": {\n \"signal\": \"total_entities === 0 ? '' : (total_entities < 10000 ? 'Showing ' + total_entities + ' queues' : 'Showing top 10,000 queues (limit reached)')\"\n },\n \"align\": {\n \"value\": \"right\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n }\n }\n },\n {\n \"name\": \"hexagons\",\n \"type\": \"symbol\",\n \"from\": {\n \"data\": \"entities\"\n },\n \"encode\": {\n \"enter\": {\n \"cursor\": {\n \"value\": \"pointer\"\n }\n },\n \"update\": {\n \"x\": {\n \"field\": \"x\"\n },\n \"y\": {\n \"field\": \"y\"\n },\n \"size\": {\n \"field\": \"hexSize\"\n },\n \"fill\": [\n {\n \"test\": \"metric == 'status'\",\n \"scale\": \"status_color\",\n \"field\": \"status_num\"\n },\n {\n \"test\": \"datum.active_val == null\",\n \"value\": \"#BFDBFF\"\n },\n {\n \"test\": \"metric == 'age'\",\n \"scale\": \"age_color\",\n \"field\": \"active_val\"\n },\n {\n \"test\": \"metric == 'depth'\",\n \"scale\": \"depth_color\",\n \"field\": \"active_val\"\n },\n {\n \"value\": \"#BFDBFF\"\n }\n ],\n \"fillOpacity\": {\n \"value\": 0.92\n },\n \"shape\": {\n \"value\": \"M0,-1L0.866,-0.5L0.866,0.5L0,1L-0.866,0.5L-0.866,-0.5Z\"\n },\n \"strokeWidth\": [\n {\n \"test\": \"selected_entity && selected_entity.id === datum.entity_id\",\n \"value\": 3.5\n },\n {\n \"test\": \"tooltip.entity_id === datum.entity_id\",\n \"value\": 3\n },\n {\n \"value\": 1\n }\n ],\n \"stroke\": [\n {\n \"test\": \"selected_entity && selected_entity.id === datum.entity_id\",\n \"value\": \"#0077CC\"\n },\n {\n \"test\": \"tooltip.entity_id === datum.entity_id\",\n \"value\": \"#222\"\n },\n {\n \"value\": \"#FFFFFF\"\n }\n ],\n \"strokeOpacity\": [\n {\n \"test\": \"selected_entity && selected_entity.id === datum.entity_id\",\n \"value\": 1\n },\n {\n \"test\": \"tooltip.entity_id === datum.entity_id\",\n \"value\": 1\n },\n {\n \"value\": 0.3\n }\n ]\n }\n }\n },\n {\n \"type\": \"group\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"legendX\"\n },\n \"y\": {\n \"signal\": \"buttonsH + 8\"\n }\n }\n },\n \"marks\": [\n {\n \"type\": \"text\",\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 0\n },\n \"y\": {\n \"value\": 0\n },\n \"text\": {\n \"value\": \"Status\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": \"bold\"\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"opacity\": [\n {\n \"test\": \"metric == 'status'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"symbol\",\n \"from\": {\n \"data\": \"status_legend\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 6\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"size\": {\n \"value\": 110\n },\n \"shape\": {\n \"value\": \"circle\"\n },\n \"fill\": {\n \"scale\": \"status_color\",\n \"field\": \"val\"\n },\n \"stroke\": {\n \"value\": \"#FFFFFF\"\n },\n \"strokeWidth\": {\n \"value\": 1\n }\n },\n \"update\": {\n \"opacity\": [\n {\n \"test\": \"metric == 'status'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"text\",\n \"from\": {\n \"data\": \"status_legend\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 18\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"text\": {\n \"signal\": \"datum.label + ' (' + datum.count + ')'\"\n },\n \"opacity\": [\n {\n \"test\": \"metric == 'status'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n }\n ]\n },\n {\n \"type\": \"group\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"legendX\"\n },\n \"y\": {\n \"signal\": \"buttonsH + 8\"\n }\n }\n },\n \"marks\": [\n {\n \"type\": \"text\",\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 0\n },\n \"y\": {\n \"value\": 0\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": \"bold\"\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"text\": {\n \"signal\": \"'Oldest age (' + agg + ')'\"\n },\n \"opacity\": [\n {\n \"test\": \"metric == 'age'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"symbol\",\n \"from\": {\n \"data\": \"age_legend_stops\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 6\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"size\": {\n \"value\": 110\n },\n \"shape\": {\n \"value\": \"circle\"\n },\n \"stroke\": {\n \"value\": \"#FFFFFF\"\n },\n \"strokeWidth\": {\n \"value\": 1\n }\n },\n \"update\": {\n \"fill\": [\n {\n \"test\": \"datum.is_nodata\",\n \"value\": \"#BFDBFF\"\n },\n {\n \"scale\": \"age_color\",\n \"field\": \"val\"\n }\n ],\n \"opacity\": [\n {\n \"test\": \"metric == 'age'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"text\",\n \"from\": {\n \"data\": \"age_legend_stops\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 18\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"text\": {\n \"signal\": \"datum.label + ' (' + datum.count + ')'\"\n },\n \"opacity\": [\n {\n \"test\": \"metric == 'age'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n }\n ]\n },\n {\n \"type\": \"group\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"legendX\"\n },\n \"y\": {\n \"signal\": \"buttonsH + 8\"\n }\n }\n },\n \"marks\": [\n {\n \"type\": \"text\",\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 0\n },\n \"y\": {\n \"value\": 0\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": \"bold\"\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"text\": {\n \"signal\": \"'Depth (' + agg + ')'\"\n },\n \"opacity\": [\n {\n \"test\": \"metric == 'depth'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"symbol\",\n \"from\": {\n \"data\": \"depth_legend_stops\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 6\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"size\": {\n \"value\": 110\n },\n \"shape\": {\n \"value\": \"circle\"\n },\n \"stroke\": {\n \"value\": \"#FFFFFF\"\n },\n \"strokeWidth\": {\n \"value\": 1\n }\n },\n \"update\": {\n \"fill\": [\n {\n \"test\": \"datum.is_nodata\",\n \"value\": \"#BFDBFF\"\n },\n {\n \"scale\": \"depth_color\",\n \"field\": \"val\"\n }\n ],\n \"opacity\": [\n {\n \"test\": \"metric == 'depth'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"text\",\n \"from\": {\n \"data\": \"depth_legend_stops\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 18\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"text\": {\n \"signal\": \"datum.label + ' (' + datum.count + ')'\"\n },\n \"opacity\": [\n {\n \"test\": \"metric == 'depth'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n }\n ]\n },\n {\n \"type\": \"group\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"tooltip.x + 18 + 290 > width - legendW - 10 ? max(tooltip.x - 18 - 290, 5) : tooltip.x + 18\"\n },\n \"y\": {\n \"signal\": \"max(tooltip.y - 30, 5)\"\n },\n \"width\": {\n \"value\": 290\n },\n \"height\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? 110 : 124) : 110\"\n },\n \"opacity\": [\n {\n \"test\": \"tooltip.entity_id\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ],\n \"fill\": {\n \"value\": \"#0E1728\"\n },\n \"stroke\": {\n \"value\": \"#2A3144\"\n },\n \"strokeWidth\": {\n \"value\": 1\n },\n \"cornerRadius\": {\n \"value\": 8\n }\n }\n },\n \"marks\": [\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 12\n },\n \"y\": {\n \"value\": 12\n },\n \"text\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? [tooltip.entity_id] : [slice(tooltip.entity_id, 0, 36), slice(tooltip.entity_id, 36)]) : ['']\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"lineHeight\": {\n \"value\": 14\n },\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fontWeight\": {\n \"value\": \"bold\"\n },\n \"fill\": {\n \"value\": \"#fff\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 12\n },\n \"y\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? 36 : 50) : 36\"\n },\n \"text\": {\n \"signal\": \"tooltip.entity_id ? 'Status: ' + tooltip.status_label : ''\"\n },\n \"fontSize\": {\n \"value\": 10\n },\n \"fontWeight\": [\n {\n \"test\": \"metric == 'status'\",\n \"value\": \"bold\"\n },\n {\n \"value\": \"normal\"\n }\n ],\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fill\": {\n \"signal\": \"metric == 'status' ? (tooltip.status_num == 0 ? '#F6726A' : tooltip.status_num == 1 ? '#D6BF57' : tooltip.status_num == 2 ? '#24C292' : tooltip.status_num == 3 ? '#BFDBFF' : '#BFDBFF') : '#9da4b3'\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 12\n },\n \"y\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? 50 : 64) : 50\"\n },\n \"text\": {\n \"signal\": \"tooltip.entity_id ? 'Oldest age (' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last') + '): ' + (tooltip[('age_' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] != null ? format(tooltip[('age_' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))], ',d') + ' s' : 'Unknown') : ''\"\n },\n \"fontSize\": {\n \"value\": 10\n },\n \"fontWeight\": [\n {\n \"test\": \"metric == 'age'\",\n \"value\": \"bold\"\n },\n {\n \"value\": \"normal\"\n }\n ],\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fill\": {\n \"signal\": \"metric == 'age' ? (tooltip[('age_' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] == null ? '#9da4b3' : tooltip[('age_' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] >= 300 ? '#F6726A' : tooltip[('age_' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] >= 60 ? '#D6BF57' : '#24C292') : '#9da4b3'\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 12\n },\n \"y\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? 64 : 78) : 64\"\n },\n \"text\": {\n \"signal\": \"tooltip.entity_id ? 'Depth (' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last') + '): ' + (tooltip[('depth_' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] != null ? format(tooltip[('depth_' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))], ',d') + '' : 'Unknown') : ''\"\n },\n \"fontSize\": {\n \"value\": 10\n },\n \"fontWeight\": [\n {\n \"test\": \"metric == 'depth'\",\n \"value\": \"bold\"\n },\n {\n \"value\": \"normal\"\n }\n ],\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fill\": {\n \"signal\": \"metric == 'depth' ? (tooltip[('depth_' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] == null ? '#9da4b3' : tooltip[('depth_' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] >= 1000 ? '#F6726A' : tooltip[('depth_' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] >= 100 ? '#D6BF57' : '#24C292') : '#9da4b3'\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 12\n },\n \"y\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? 82 : 96) : 82\"\n },\n \"text\": {\n \"signal\": \"tooltip.entity_id ? '› Click for actions' : ''\"\n },\n \"fontSize\": {\n \"value\": 9\n },\n \"fontStyle\": {\n \"value\": \"italic\"\n },\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fill\": {\n \"value\": \"#9da4b3\"\n }\n }\n }\n }\n ]\n },\n {\n \"type\": \"rect\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"(width - legendW) / 2 - 120\"\n },\n \"x2\": {\n \"signal\": \"(width - legendW) / 2 + 120\"\n },\n \"y\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2 - 45\"\n },\n \"y2\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2 + 45\"\n },\n \"fill\": {\n \"value\": \"#1A1C21\"\n },\n \"fillOpacity\": {\n \"signal\": \"(loading || loading_timeout) ? 0.92 : 0\"\n },\n \"stroke\": {\n \"value\": \"#838C99\"\n },\n \"strokeOpacity\": {\n \"signal\": \"(loading || loading_timeout) ? 0.4 : 0\"\n },\n \"strokeWidth\": {\n \"value\": 1\n },\n \"cornerRadius\": {\n \"value\": 12\n }\n }\n }\n },\n {\n \"type\": \"symbol\",\n \"interactive\": false,\n \"from\": {\n \"data\": \"spinner_dots\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"(width - legendW) / 2 + 18 * cos(datum.i * PI / 4 - PI / 2)\"\n },\n \"y\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2 - 8 + 18 * sin(datum.i * PI / 4 - PI / 2)\"\n },\n \"size\": {\n \"value\": 70\n },\n \"shape\": {\n \"value\": \"circle\"\n },\n \"fill\": {\n \"value\": \"#0077CC\"\n },\n \"opacity\": {\n \"signal\": \"loading ? 0.15 + 0.85 * (1 - (((floor(tick / 100) % 8) - datum.i + 8) % 8) / 7) : 0\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"(width - legendW) / 2\"\n },\n \"y\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2 + 28\"\n },\n \"text\": {\n \"value\": \"Loading data…\"\n },\n \"align\": {\n \"value\": \"center\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 12\n },\n \"fontWeight\": {\n \"value\": 500\n },\n \"fill\": {\n \"value\": \"#FFFFFF\"\n },\n \"opacity\": {\n \"signal\": \"loading && !loading_timeout ? 1 : 0\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"(width - legendW) / 2\"\n },\n \"y\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2 + 28\"\n },\n \"text\": {\n \"value\": \"Still loading… (taking longer than usual)\"\n },\n \"align\": {\n \"value\": \"center\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 12\n },\n \"fontWeight\": {\n \"value\": 500\n },\n \"fill\": {\n \"value\": \"#FFFFFF\"\n },\n \"opacity\": {\n \"signal\": \"loading_timeout ? 1 : 0\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"(width - legendW) / 2\"\n },\n \"y\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2\"\n },\n \"text\": {\n \"value\": \"No queues for the selected time range\"\n },\n \"align\": {\n \"value\": \"center\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 13\n },\n \"fontWeight\": {\n \"value\": 500\n },\n \"fill\": {\n \"value\": \"#838C99\"\n },\n \"opacity\": {\n \"signal\": \"no_data ? 1 : 0\"\n }\n }\n }\n },\n {\n \"name\": \"menu_backdrop\",\n \"type\": \"rect\",\n \"from\": {\n \"data\": \"menu_visible\"\n },\n \"encode\": {\n \"enter\": {\n \"cursor\": {\n \"value\": \"default\"\n }\n },\n \"update\": {\n \"x\": {\n \"value\": 0\n },\n \"y\": {\n \"value\": 0\n },\n \"x2\": {\n \"signal\": \"width\"\n },\n \"y2\": {\n \"signal\": \"height\"\n },\n \"fill\": {\n \"value\": \"#000000\"\n },\n \"fillOpacity\": {\n \"value\": 0\n }\n }\n }\n },\n {\n \"name\": \"menu_box\",\n \"type\": \"rect\",\n \"from\": {\n \"data\": \"menu_visible\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"menu_x\"\n },\n \"y\": {\n \"signal\": \"menu_y\"\n },\n \"width\": {\n \"value\": 248\n },\n \"height\": {\n \"value\": 90\n },\n \"fill\": {\n \"value\": \"#0E1728\"\n },\n \"stroke\": {\n \"value\": \"#2A3144\"\n },\n \"strokeWidth\": {\n \"value\": 1\n },\n \"cornerRadius\": {\n \"value\": 6\n }\n }\n }\n },\n {\n \"name\": \"menu_header\",\n \"type\": \"text\",\n \"interactive\": false,\n \"from\": {\n \"data\": \"menu_visible\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"menu_x + 12\"\n },\n \"y\": {\n \"signal\": \"menu_y + 13.0\"\n },\n \"text\": {\n \"signal\": \"selected_entity ? 'Queue: ' + (length(selected_entity.id) > 30 ? slice(selected_entity.id, 0, 28) + '…' : selected_entity.id) : ''\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": 600\n },\n \"fill\": {\n \"value\": \"#98A2B3\"\n }\n }\n }\n },\n {\n \"name\": \"menu_separator\",\n \"type\": \"rule\",\n \"from\": {\n \"data\": \"menu_visible\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"menu_x + 8\"\n },\n \"x2\": {\n \"signal\": \"menu_x + 240\"\n },\n \"y\": {\n \"signal\": \"menu_y + 26\"\n },\n \"stroke\": {\n \"value\": \"#2A3144\"\n },\n \"strokeWidth\": {\n \"value\": 1\n }\n }\n }\n },\n {\n \"name\": \"menu_item_bg\",\n \"type\": \"rect\",\n \"from\": {\n \"data\": \"menu_items_visible\"\n },\n \"encode\": {\n \"enter\": {\n \"cursor\": {\n \"value\": \"pointer\"\n }\n },\n \"update\": {\n \"x\": {\n \"signal\": \"menu_x\"\n },\n \"y\": {\n \"signal\": \"menu_y + 30 + datum.idx * 30\"\n },\n \"width\": {\n \"value\": 248\n },\n \"height\": {\n \"value\": 30\n },\n \"fill\": {\n \"value\": \"#0E1728\"\n },\n \"href\": {\n \"signal\": \"selected_entity ? (datum.id === 'filter' ? ('/app/dashboards#/view/aws_sqs_otel-b1c3d401-841f-43f1-9421-4afc51a2ec87?' + g_param + '_a=(filters:!((meta:(alias:!n,disabled:!f,index:%27metrics-*%27,key:QueueName,negate:!f,params:(query:%27' + selected_entity.id + '%27),type:phrase),query:(match_phrase:(QueueName:%27' + selected_entity.id + '%27)))),query:(language:kuery,query:%27%27))') : datum.id === 'metrics' ? ('/app/discover#/?_g=(time:(from:%27' + time_from + '%27,to:%27' + time_to + '%27))&_a=(dataSource:(dataViewId:%27metrics-*%27,type:dataView),query:(language:kuery,query:%27' + 'QueueName:%22' + selected_entity.id + '%22' + '%27))') : '') : ''\"\n }\n },\n \"hover\": {\n \"fill\": {\n \"value\": \"#1A2640\"\n }\n }\n }\n },\n {\n \"name\": \"menu_item_label\",\n \"type\": \"text\",\n \"interactive\": false,\n \"from\": {\n \"data\": \"menu_items_visible\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"menu_x + 14\"\n },\n \"y\": {\n \"signal\": \"menu_y + 30 + datum.idx * 30 + 15.0\"\n },\n \"text\": {\n \"field\": \"label\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 12\n },\n \"fill\": {\n \"value\": \"#DFE5EF\"\n }\n }\n }\n }\n ],\n \"background\": \"transparent\",\n \"autosize\": {\n \"type\": \"fit\",\n \"contains\": \"padding\"\n }\n}" + "spec": "{\n \"$schema\": \"https://vega.github.io/schema/vega/v5.json\",\n \"description\": \"One hexagon per SQS queue, ordered worst-first with stale or backlogged queues first. States: stale (oldest message > 300 s), backlogged (depth > 1000), healthy (all other active queues), Unknown (no metric data). Toggle Color by between Status, Oldest Message Age, or Queue Depth; metric views support Min, Max, Avg, and Last over the dashboard time range. Click any hexagon to filter the dashboard or open metrics for that queue.\",\n \"usermeta\": {\n \"x_sqs_hexmap\": true\n },\n \"padding\": {\n \"top\": 10,\n \"left\": 10,\n \"right\": 10,\n \"bottom\": 15\n },\n \"data\": [\n {\n \"name\": \"ts_probe\",\n \"url\": {\n \"%type%\": \"esql\",\n \"%context%\": true,\n \"%timefield%\": \"@timestamp\",\n \"query\": \"ROW round_key = CONCAT(TO_STRING(?_tstart), \\\"|\\\", TO_STRING(?_tend)), fetched_at = NOW()\"\n }\n },\n {\n \"name\": \"raw_all\",\n \"url\": {\n \"%type%\": \"esql\",\n \"%context%\": true,\n \"%timefield%\": \"@timestamp\",\n \"query\": \"SET unmapped_fields = \\\"nullify\\\";\\nTS metrics-aws.sqs.otel-* | WHERE @timestamp >= ?_tstart AND @timestamp <= ?_tend\\n AND QueueName IS NOT NULL AND QueueName != \\\"\\\" | WHERE stat IN (\\\"Average\\\", \\\"Maximum\\\", \\\"Sum\\\") | STATS age_min = MIN(MIN_OVER_TIME(CASE(stat == \\\"Average\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`, NULL))), age_max = MAX(MAX_OVER_TIME(CASE(stat == \\\"Maximum\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`, NULL))), age_avg = AVG(AVG_OVER_TIME(CASE(stat == \\\"Average\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`, NULL))), age_last = MAX(LAST_OVER_TIME(CASE(stat == \\\"Maximum\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateAgeOfOldestMessage`, NULL))), depth_min = MIN(MIN_OVER_TIME(CASE(stat == \\\"Average\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`, NULL))), depth_max = MAX(MAX_OVER_TIME(CASE(stat == \\\"Maximum\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`, NULL))), depth_avg = AVG(AVG_OVER_TIME(CASE(stat == \\\"Average\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`, NULL))), depth_last = MAX(LAST_OVER_TIME(CASE(stat == \\\"Maximum\\\", `metrics.amazonaws.com/AWS/SQS/ApproximateNumberOfMessagesVisible`, NULL))), sent_total = SUM(SUM_OVER_TIME(CASE(stat == \\\"Sum\\\", `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent`, NULL))), sent_last = MAX(LAST_OVER_TIME(CASE(stat == \\\"Sum\\\", `metrics.amazonaws.com/AWS/SQS/NumberOfMessagesSent`, NULL))) BY entity_id = QueueName, cloud.region | EVAL status_num = CASE(\\n age_last IS NULL AND depth_last IS NULL AND sent_last IS NULL, 3,\\n depth_last > 1000, 1,\\n age_last > 300, 0,\\n 2),\\n status_label = CASE(\\n age_last IS NULL AND depth_last IS NULL AND sent_last IS NULL, \\\"Unknown\\\",\\n depth_last > 1000, \\\"backlogged\\\",\\n age_last > 300, \\\"stale\\\",\\n \\\"healthy\\\"),\\n severity_rank = status_num,\\n round_key = CONCAT(TO_STRING(?_tstart), \\\"|\\\", TO_STRING(?_tend)),\\n fetched_at = NOW(),\\n region = `cloud.region`\\n| KEEP entity_id, region, status_num, status_label, severity_rank,\\n age_min, age_max, age_avg, age_last,\\n depth_min, depth_max, depth_avg, depth_last,\\n round_key, fetched_at\\n| LIMIT 10000\"\n }\n },\n {\n \"name\": \"ranked_status\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"severity_rank\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_age_min\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.age_min == null ? 1e12 : -datum.age_min * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_age_max\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.age_max == null ? 1e12 : -datum.age_max * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_age_avg\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.age_avg == null ? 1e12 : -datum.age_avg * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_age_last\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.age_last == null ? 1e12 : -datum.age_last * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_depth_min\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.depth_min == null ? 1e12 : -datum.depth_min * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_depth_max\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.depth_max == null ? 1e12 : -datum.depth_max * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_depth_avg\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.depth_avg == null ? 1e12 : -datum.depth_avg * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"ranked_depth_last\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"sort_key\",\n \"expr\": \"datum.depth_last == null ? 1e12 : -datum.depth_last * 1000000\"\n },\n {\n \"type\": \"collect\",\n \"sort\": {\n \"field\": [\n \"sort_key\",\n \"entity_id\"\n ],\n \"order\": [\n \"ascending\",\n \"ascending\"\n ]\n }\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"active_rank\"\n ]\n }\n ]\n },\n {\n \"name\": \"active\",\n \"values\": [],\n \"on\": [\n {\n \"trigger\": \"ts_round !== '' && active_round !== '' && active_round !== ts_round\",\n \"remove\": \"true\"\n },\n {\n \"trigger\": \"metric === 'status' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_status')\"\n },\n {\n \"trigger\": \"metric === 'age' && effective_agg === 'min' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_age_min')\"\n },\n {\n \"trigger\": \"metric === 'age' && effective_agg === 'max' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_age_max')\"\n },\n {\n \"trigger\": \"metric === 'age' && effective_agg === 'avg' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_age_avg')\"\n },\n {\n \"trigger\": \"metric === 'age' && effective_agg === 'last' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_age_last')\"\n },\n {\n \"trigger\": \"metric === 'depth' && effective_agg === 'min' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_depth_min')\"\n },\n {\n \"trigger\": \"metric === 'depth' && effective_agg === 'max' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_depth_max')\"\n },\n {\n \"trigger\": \"metric === 'depth' && effective_agg === 'avg' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_depth_avg')\"\n },\n {\n \"trigger\": \"metric === 'depth' && effective_agg === 'last' && len_raw > 0 && raw_round === ts_round && ts_round !== ''\",\n \"remove\": \"true\",\n \"insert\": \"data('ranked_depth_last')\"\n }\n ]\n },\n {\n \"name\": \"entities\",\n \"source\": \"active\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"active_val\",\n \"expr\": \"metric=='status' ? null : (metric=='age' ? (effective_agg=='min' ? datum.age_min : effective_agg=='max' ? datum.age_max : effective_agg=='avg' ? datum.age_avg : effective_agg=='last' ? datum.age_last : null) : (metric=='depth' ? (effective_agg=='min' ? datum.depth_min : effective_agg=='max' ? datum.depth_max : effective_agg=='avg' ? datum.depth_avg : effective_agg=='last' ? datum.depth_last : null) : null))\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"index0\",\n \"expr\": \"datum.active_rank - 1\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"col\",\n \"expr\": \"datum.index0 % gridCols\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"row\",\n \"expr\": \"floor(datum.index0 / gridCols)\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"x\",\n \"expr\": \"datum.col * gapX + (datum.row % 2 == 1 ? gapX / 2 : 0) + hexR + 5\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"y\",\n \"expr\": \"datum.row * gapY + hexR + 5 + hexOffsetY\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"hexSize\",\n \"expr\": \"hexR * hexR * 3.46\"\n }\n ]\n },\n {\n \"name\": \"status_counts\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"aggregate\",\n \"groupby\": [\n \"status_num\"\n ],\n \"ops\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ]\n }\n ]\n },\n {\n \"name\": \"status_legend\",\n \"values\": [\n {\n \"label\": \"Stale\",\n \"val\": 0\n },\n {\n \"label\": \"Backlogged\",\n \"val\": 1\n },\n {\n \"label\": \"Healthy\",\n \"val\": 2\n },\n {\n \"label\": \"Unknown\",\n \"val\": 3\n }\n ],\n \"transform\": [\n {\n \"type\": \"lookup\",\n \"from\": \"status_counts\",\n \"key\": \"status_num\",\n \"fields\": [\n \"val\"\n ],\n \"values\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ],\n \"default\": 0\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"idx\"\n ]\n }\n ]\n },\n {\n \"name\": \"age_counts\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"v\",\n \"expr\": \"agg == 'min' ? datum.age_min : agg == 'max' ? datum.age_max : agg == 'avg' ? datum.age_avg : agg == 'last' ? datum.age_last : null\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"bucket\",\n \"expr\": \"datum.v == null ? 3 : (datum.v >= 300 ? 2 : datum.v >= 60 ? 1 : 0)\"\n },\n {\n \"type\": \"aggregate\",\n \"groupby\": [\n \"bucket\"\n ],\n \"ops\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ]\n }\n ]\n },\n {\n \"name\": \"depth_counts\",\n \"source\": \"raw_all\",\n \"transform\": [\n {\n \"type\": \"formula\",\n \"as\": \"v\",\n \"expr\": \"agg == 'min' ? datum.depth_min : agg == 'max' ? datum.depth_max : agg == 'avg' ? datum.depth_avg : agg == 'last' ? datum.depth_last : null\"\n },\n {\n \"type\": \"formula\",\n \"as\": \"bucket\",\n \"expr\": \"datum.v == null ? 3 : (datum.v >= 1000 ? 2 : datum.v >= 100 ? 1 : 0)\"\n },\n {\n \"type\": \"aggregate\",\n \"groupby\": [\n \"bucket\"\n ],\n \"ops\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ]\n }\n ]\n },\n {\n \"name\": \"age_legend_stops\",\n \"values\": [\n {\n \"label\": \"≥ 300 s\",\n \"val\": 600,\n \"bucket\": 2,\n \"is_nodata\": false\n },\n {\n \"label\": \"60 – 299 s\",\n \"val\": 120,\n \"bucket\": 1,\n \"is_nodata\": false\n },\n {\n \"label\": \"< 60 s\",\n \"val\": 10,\n \"bucket\": 0,\n \"is_nodata\": false\n },\n {\n \"label\": \"Unknown\",\n \"val\": null,\n \"bucket\": 3,\n \"is_nodata\": true\n }\n ],\n \"transform\": [\n {\n \"type\": \"lookup\",\n \"from\": \"age_counts\",\n \"key\": \"bucket\",\n \"fields\": [\n \"bucket\"\n ],\n \"values\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ],\n \"default\": 0\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"idx\"\n ]\n }\n ]\n },\n {\n \"name\": \"depth_legend_stops\",\n \"values\": [\n {\n \"label\": \"≥ 1000\",\n \"val\": 5000,\n \"bucket\": 2,\n \"is_nodata\": false\n },\n {\n \"label\": \"100 – 999\",\n \"val\": 500,\n \"bucket\": 1,\n \"is_nodata\": false\n },\n {\n \"label\": \"< 100\",\n \"val\": 10,\n \"bucket\": 0,\n \"is_nodata\": false\n },\n {\n \"label\": \"Unknown\",\n \"val\": null,\n \"bucket\": 3,\n \"is_nodata\": true\n }\n ],\n \"transform\": [\n {\n \"type\": \"lookup\",\n \"from\": \"depth_counts\",\n \"key\": \"bucket\",\n \"fields\": [\n \"bucket\"\n ],\n \"values\": [\n \"count\"\n ],\n \"as\": [\n \"count\"\n ],\n \"default\": 0\n },\n {\n \"type\": \"window\",\n \"ops\": [\n \"row_number\"\n ],\n \"as\": [\n \"idx\"\n ]\n }\n ]\n },\n {\n \"name\": \"spinner_dots\",\n \"values\": [\n {\n \"i\": 0\n },\n {\n \"i\": 1\n },\n {\n \"i\": 2\n },\n {\n \"i\": 3\n },\n {\n \"i\": 4\n },\n {\n \"i\": 5\n },\n {\n \"i\": 6\n },\n {\n \"i\": 7\n }\n ]\n },\n {\n \"name\": \"pills\",\n \"values\": [\n {\n \"id\": \"status\",\n \"label\": \"Status\",\n \"group\": \"metric\",\n \"x\": 69,\n \"w\": 48,\n \"available_aggs\": [],\n \"default_agg\": \"last\"\n },\n {\n \"id\": \"age\",\n \"label\": \"Oldest age (s)\",\n \"group\": \"metric\",\n \"x\": 125,\n \"w\": 108,\n \"available_aggs\": [\n \"min\",\n \"max\",\n \"avg\",\n \"last\"\n ],\n \"default_agg\": \"last\"\n },\n {\n \"id\": \"depth\",\n \"label\": \"Depth\",\n \"group\": \"metric\",\n \"x\": 241,\n \"w\": 56,\n \"available_aggs\": [\n \"min\",\n \"max\",\n \"avg\",\n \"last\"\n ],\n \"default_agg\": \"last\"\n },\n {\n \"id\": \"min\",\n \"label\": \"Min\",\n \"group\": \"agg\",\n \"x\": 425,\n \"w\": 36,\n \"valid_for\": [\n \"age\",\n \"depth\"\n ]\n },\n {\n \"id\": \"max\",\n \"label\": \"Max\",\n \"group\": \"agg\",\n \"x\": 465,\n \"w\": 36,\n \"valid_for\": [\n \"age\",\n \"depth\"\n ]\n },\n {\n \"id\": \"avg\",\n \"label\": \"Avg\",\n \"group\": \"agg\",\n \"x\": 505,\n \"w\": 36,\n \"valid_for\": [\n \"age\",\n \"depth\"\n ]\n },\n {\n \"id\": \"last\",\n \"label\": \"Last\",\n \"group\": \"agg\",\n \"x\": 545,\n \"w\": 40,\n \"valid_for\": [\n \"age\",\n \"depth\"\n ]\n },\n {\n \"id\": \"sum\",\n \"label\": \"Sum\",\n \"group\": \"agg\",\n \"x\": 589,\n \"w\": 40,\n \"valid_for\": []\n }\n ]\n },\n {\n \"name\": \"menu_items_data\",\n \"values\": [\n {\n \"id\": \"details\",\n \"label\": \"1. View details\",\n \"idx\": 0\n },\n {\n \"id\": \"metrics\",\n \"label\": \"View queue metrics in Discover\",\n \"idx\": 1\n }\n ]\n },\n {\n \"name\": \"menu_visible\",\n \"values\": [\n {\n \"_\": 0\n }\n ],\n \"transform\": [\n {\n \"type\": \"filter\",\n \"expr\": \"selected_entity != null\"\n }\n ]\n },\n {\n \"name\": \"menu_items_visible\",\n \"source\": \"menu_items_data\",\n \"transform\": [\n {\n \"type\": \"filter\",\n \"expr\": \"selected_entity != null\"\n }\n ]\n }\n ],\n \"signals\": [\n {\n \"name\": \"metric\",\n \"value\": \"status\",\n \"on\": [\n {\n \"events\": \"@pill_bg:click\",\n \"update\": \"datum.group === 'metric' ? datum.id : metric\"\n }\n ]\n },\n {\n \"name\": \"agg\",\n \"value\": \"last\",\n \"on\": [\n {\n \"events\": \"@pill_bg:click\",\n \"update\": \"datum.group === 'agg' && metric !== 'status' && indexof(datum.valid_for, metric) >= 0 ? datum.id : ( datum.group === 'metric' && datum.id !== 'status' ? (indexof(datum.available_aggs, agg) >= 0 ? agg : datum.default_agg) : agg )\"\n }\n ]\n },\n {\n \"name\": \"effective_agg\",\n \"update\": \"metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'\"\n },\n {\n \"name\": \"groupHeaderH\",\n \"value\": 20\n },\n {\n \"name\": \"groupGap\",\n \"value\": 10\n },\n {\n \"name\": \"group_by\",\n \"value\": \"none\"\n },\n {\n \"name\": \"len_raw\",\n \"update\": \"length(data('raw_all'))\"\n },\n {\n \"name\": \"len_active\",\n \"update\": \"length(data('active'))\"\n },\n {\n \"name\": \"ts_round\",\n \"update\": \"data('ts_probe')[0] ? data('ts_probe')[0].round_key : ''\"\n },\n {\n \"name\": \"time_from\",\n \"update\": \"ts_round !== '' && indexof(ts_round, '|') > 0 ? slice(ts_round, 0, indexof(ts_round, '|')) : ''\"\n },\n {\n \"name\": \"time_to\",\n \"update\": \"ts_round !== '' && indexof(ts_round, '|') > 0 ? slice(ts_round, indexof(ts_round, '|') + 1) : ''\"\n },\n {\n \"name\": \"g_param\",\n \"update\": \"time_from !== '' && time_to !== '' ? '_g=(time:(from:%27' + time_from + '%27,to:%27' + time_to + '%27))&' : ''\"\n },\n {\n \"name\": \"raw_round\",\n \"update\": \"data('raw_all')[0] ? data('raw_all')[0].round_key : ''\"\n },\n {\n \"name\": \"active_round\",\n \"update\": \"raw_round\"\n },\n {\n \"name\": \"raw_fetched_str\",\n \"update\": \"data('raw_all')[0] ? data('raw_all')[0].fetched_at : ''\"\n },\n {\n \"name\": \"active_fetched\",\n \"update\": \"raw_fetched_str !== '' ? toDate(raw_fetched_str) : 0\"\n },\n {\n \"name\": \"tick\",\n \"value\": 0,\n \"on\": [\n {\n \"events\": {\n \"type\": \"timer\",\n \"throttle\": 100\n },\n \"update\": \"now()\"\n }\n ]\n },\n {\n \"name\": \"url_change_at\",\n \"value\": 0,\n \"on\": [\n {\n \"events\": {\n \"source\": \"window\",\n \"type\": \"hashchange\"\n },\n \"update\": \"now()\"\n },\n {\n \"events\": {\n \"source\": \"window\",\n \"type\": \"popstate\"\n },\n \"update\": \"now()\"\n }\n ]\n },\n {\n \"name\": \"fetch_tracker\",\n \"init\": \"{seen: 0, arrived_at: 0}\",\n \"on\": [\n {\n \"events\": {\n \"signal\": \"tick\"\n },\n \"update\": \"active_fetched > 0 && active_fetched !== fetch_tracker.seen ? {seen: active_fetched, arrived_at: tick} : fetch_tracker\"\n }\n ]\n },\n {\n \"name\": \"loading_raw\",\n \"update\": \"len_active === 0 || ts_round === '' || active_round === '' || active_round !== ts_round || (url_change_at > 0 && fetch_tracker.arrived_at < url_change_at)\"\n },\n {\n \"name\": \"loading_started_at\",\n \"value\": 0,\n \"on\": [\n {\n \"events\": {\n \"signal\": \"tick\"\n },\n \"update\": \"loading_raw ? (loading_started_at === 0 ? tick : loading_started_at) : 0\"\n }\n ]\n },\n {\n \"name\": \"loading_elapsed\",\n \"update\": \"loading_started_at > 0 ? tick - loading_started_at : 0\"\n },\n {\n \"name\": \"no_data\",\n \"update\": \"loading_raw && ts_round !== '' && len_raw === 0 && loading_elapsed > 2000\"\n },\n {\n \"name\": \"loading\",\n \"update\": \"loading_raw && !no_data\"\n },\n {\n \"name\": \"loading_timeout\",\n \"update\": \"loading && loading_elapsed > 15000\"\n },\n {\n \"name\": \"total_entities\",\n \"update\": \"len_raw\"\n },\n {\n \"name\": \"legendW\",\n \"value\": 138\n },\n {\n \"name\": \"buttonsH\",\n \"value\": 34\n },\n {\n \"name\": \"availW\",\n \"update\": \"width - 20 - legendW\"\n },\n {\n \"name\": \"n_groups\",\n \"value\": 0\n },\n {\n \"name\": \"availH\",\n \"update\": \"height - 20 - buttonsH - (group_by !== 'none' ? n_groups * (groupHeaderH + groupGap) : 0)\"\n },\n {\n \"name\": \"hexOffsetY\",\n \"update\": \"buttonsH\"\n },\n {\n \"name\": \"idealCols\",\n \"update\": \"total_entities > 0 && availH > 0 ? max(1, round(sqrt(total_entities * (availW / availH)))) : 1\"\n },\n {\n \"name\": \"idealRows\",\n \"update\": \"max(1, ceil(total_entities / idealCols))\"\n },\n {\n \"name\": \"hexRInitial\",\n \"update\": \"min(availW / (idealCols * 2 + 0), availH / (idealRows * 2 + 0))\"\n },\n {\n \"name\": \"maxColsAtHexR\",\n \"update\": \"max(idealCols, floor(availW / (max(3, hexRInitial) * 2)))\"\n },\n {\n \"name\": \"maxColsAtMinR\",\n \"update\": \"max(1, floor(availW / (3 * 2)))\"\n },\n {\n \"name\": \"gridCols\",\n \"update\": \"max(1, min(total_entities, min(maxColsAtHexR, maxColsAtMinR)))\"\n },\n {\n \"name\": \"gridRows\",\n \"update\": \"group_by === 'none' ? max(1, ceil(total_entities / gridCols)) : max(1, ceil(total_entities / gridCols) + max(0, n_groups - 1))\"\n },\n {\n \"name\": \"rByWidth\",\n \"update\": \"availW / (gridCols * 1.76 + 0.88)\"\n },\n {\n \"name\": \"rByHeight\",\n \"update\": \"availH / (gridRows * 1.54 + 0.92)\"\n },\n {\n \"name\": \"hexR\",\n \"update\": \"max(3, min(90, min(rByWidth, rByHeight)))\"\n },\n {\n \"name\": \"gapX\",\n \"update\": \"hexR * 1.76\"\n },\n {\n \"name\": \"gapY\",\n \"update\": \"hexR * 1.54\"\n },\n {\n \"name\": \"legendX\",\n \"update\": \"width - legendW + 4\"\n },\n {\n \"name\": \"tooltip\",\n \"value\": {},\n \"on\": [\n {\n \"events\": \"@hexagons:mouseover\",\n \"update\": \"datum\"\n },\n {\n \"events\": \"@hexagons:mouseout\",\n \"update\": \"{}\"\n }\n ]\n },\n {\n \"name\": \"selected_entity\",\n \"value\": null,\n \"on\": [\n {\n \"events\": \"@hexagons:click\",\n \"update\": \"{id: datum.entity_id, x: datum.x, y: datum.y}\"\n },\n {\n \"events\": \"@menu_backdrop:click\",\n \"update\": \"null\"\n },\n {\n \"events\": \"@menu_item_bg:click\",\n \"update\": \"null\"\n }\n ]\n },\n {\n \"name\": \"menu_x\",\n \"update\": \"selected_entity ? ((selected_entity.x + hexR + 4 + 248 > width - legendW - 4) ? max(4, selected_entity.x - hexR - 248 - 4) : max(4, selected_entity.x + hexR + 4)) : 0\"\n },\n {\n \"name\": \"menu_y\",\n \"update\": \"selected_entity ? max(buttonsH + 4, min(selected_entity.y - 75, height - 90 - 4)) : 0\"\n }\n ],\n \"scales\": [\n {\n \"name\": \"status_color\",\n \"type\": \"ordinal\",\n \"domain\": [\n 0,\n 1,\n 2,\n 3\n ],\n \"range\": [\n \"#F6726A\",\n \"#D6BF57\",\n \"#24C292\",\n \"#BFDBFF\"\n ]\n },\n {\n \"name\": \"age_color\",\n \"type\": \"threshold\",\n \"domain\": [\n 60,\n 300\n ],\n \"range\": [\n \"#24C292\",\n \"#D6BF57\",\n \"#F6726A\"\n ]\n },\n {\n \"name\": \"depth_color\",\n \"type\": \"threshold\",\n \"domain\": [\n 100,\n 1000\n ],\n \"range\": [\n \"#24C292\",\n \"#D6BF57\",\n \"#F6726A\"\n ]\n }\n ],\n \"marks\": [\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 5\n },\n \"y\": {\n \"value\": 17\n },\n \"text\": {\n \"value\": \"Color by:\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": 600\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 345\n },\n \"y\": {\n \"value\": 17\n },\n \"text\": {\n \"value\": \"Aggregation:\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": 600\n },\n \"fill\": {\n \"value\": \"#838C99\"\n },\n \"opacity\": {\n \"signal\": \"(metric === 'age' || metric === 'depth') ? 1 : 0.5\"\n }\n }\n }\n },\n {\n \"name\": \"pill_bg\",\n \"type\": \"rect\",\n \"from\": {\n \"data\": \"pills\"\n },\n \"encode\": {\n \"enter\": {},\n \"update\": {\n \"x\": {\n \"field\": \"x\"\n },\n \"x2\": {\n \"signal\": \"datum.x + datum.w\"\n },\n \"y\": {\n \"value\": 6\n },\n \"y2\": {\n \"value\": 28\n },\n \"cornerRadius\": {\n \"value\": 4\n },\n \"fill\": {\n \"signal\": \"((datum.group === 'metric' && datum.id === metric) || (datum.group === 'agg' && datum.id === effective_agg)) ? '#0077CC' : 'transparent'\"\n },\n \"stroke\": {\n \"signal\": \"((datum.group === 'metric' && datum.id === metric) || (datum.group === 'agg' && datum.id === effective_agg)) ? '#0064B0' : '#838C99'\"\n },\n \"strokeWidth\": {\n \"value\": 1\n },\n \"opacity\": {\n \"signal\": \"(datum.group === 'agg' && (!(metric === 'age' || metric === 'depth') || indexof(datum.valid_for, metric) < 0)) ? 0.5 : 1\"\n },\n \"cursor\": {\n \"signal\": \"(datum.group === 'agg' && (!(metric === 'age' || metric === 'depth') || indexof(datum.valid_for, metric) < 0)) ? 'default' : 'pointer'\"\n }\n }\n }\n },\n {\n \"name\": \"pill_label\",\n \"type\": \"text\",\n \"interactive\": false,\n \"from\": {\n \"data\": \"pills\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"datum.x + datum.w / 2\"\n },\n \"y\": {\n \"value\": 17\n },\n \"text\": {\n \"field\": \"label\"\n },\n \"align\": {\n \"value\": \"center\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": 500\n },\n \"fill\": {\n \"signal\": \"((datum.group === 'metric' && datum.id === metric) || (datum.group === 'agg' && datum.id === effective_agg)) ? '#FFFFFF' : '#838C99'\"\n },\n \"opacity\": {\n \"signal\": \"(datum.group === 'agg' && (!(metric === 'age' || metric === 'depth') || indexof(datum.valid_for, metric) < 0)) ? 0.5 : 1\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"width - legendW - 4\"\n },\n \"y\": {\n \"value\": 17\n },\n \"text\": {\n \"signal\": \"total_entities === 0 ? '' : (total_entities < 10000 ? 'Showing ' + total_entities + ' queues' : 'Showing top 10,000 queues (limit reached)')\"\n },\n \"align\": {\n \"value\": \"right\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n }\n }\n },\n {\n \"name\": \"hexagons\",\n \"type\": \"symbol\",\n \"from\": {\n \"data\": \"entities\"\n },\n \"encode\": {\n \"enter\": {\n \"cursor\": {\n \"value\": \"pointer\"\n }\n },\n \"update\": {\n \"x\": {\n \"field\": \"x\"\n },\n \"y\": {\n \"field\": \"y\"\n },\n \"size\": {\n \"field\": \"hexSize\"\n },\n \"fill\": [\n {\n \"test\": \"metric == 'status'\",\n \"scale\": \"status_color\",\n \"field\": \"status_num\"\n },\n {\n \"test\": \"datum.active_val == null\",\n \"value\": \"#BFDBFF\"\n },\n {\n \"test\": \"metric == 'age'\",\n \"scale\": \"age_color\",\n \"field\": \"active_val\"\n },\n {\n \"test\": \"metric == 'depth'\",\n \"scale\": \"depth_color\",\n \"field\": \"active_val\"\n },\n {\n \"value\": \"#BFDBFF\"\n }\n ],\n \"fillOpacity\": {\n \"value\": 0.92\n },\n \"shape\": {\n \"value\": \"M0,-1L0.866,-0.5L0.866,0.5L0,1L-0.866,0.5L-0.866,-0.5Z\"\n },\n \"strokeWidth\": [\n {\n \"test\": \"selected_entity && selected_entity.id === datum.entity_id\",\n \"value\": 3.5\n },\n {\n \"test\": \"tooltip.entity_id === datum.entity_id\",\n \"value\": 3\n },\n {\n \"value\": 1\n }\n ],\n \"stroke\": [\n {\n \"test\": \"selected_entity && selected_entity.id === datum.entity_id\",\n \"value\": \"#0077CC\"\n },\n {\n \"test\": \"tooltip.entity_id === datum.entity_id\",\n \"value\": \"#222\"\n },\n {\n \"value\": \"#FFFFFF\"\n }\n ],\n \"strokeOpacity\": [\n {\n \"test\": \"selected_entity && selected_entity.id === datum.entity_id\",\n \"value\": 1\n },\n {\n \"test\": \"tooltip.entity_id === datum.entity_id\",\n \"value\": 1\n },\n {\n \"value\": 0.3\n }\n ]\n }\n }\n },\n {\n \"type\": \"group\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"legendX\"\n },\n \"y\": {\n \"signal\": \"buttonsH + 8\"\n }\n }\n },\n \"marks\": [\n {\n \"type\": \"text\",\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 0\n },\n \"y\": {\n \"value\": 0\n },\n \"text\": {\n \"value\": \"Status\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": \"bold\"\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"opacity\": [\n {\n \"test\": \"metric == 'status'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"symbol\",\n \"from\": {\n \"data\": \"status_legend\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 6\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"size\": {\n \"value\": 110\n },\n \"shape\": {\n \"value\": \"circle\"\n },\n \"fill\": {\n \"scale\": \"status_color\",\n \"field\": \"val\"\n },\n \"stroke\": {\n \"value\": \"#FFFFFF\"\n },\n \"strokeWidth\": {\n \"value\": 1\n }\n },\n \"update\": {\n \"opacity\": [\n {\n \"test\": \"metric == 'status'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"text\",\n \"from\": {\n \"data\": \"status_legend\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 18\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"text\": {\n \"signal\": \"datum.label + ' (' + datum.count + ')'\"\n },\n \"opacity\": [\n {\n \"test\": \"metric == 'status'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n }\n ]\n },\n {\n \"type\": \"group\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"legendX\"\n },\n \"y\": {\n \"signal\": \"buttonsH + 8\"\n }\n }\n },\n \"marks\": [\n {\n \"type\": \"text\",\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 0\n },\n \"y\": {\n \"value\": 0\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": \"bold\"\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"text\": {\n \"signal\": \"'Oldest age (' + agg + ')'\"\n },\n \"opacity\": [\n {\n \"test\": \"metric == 'age'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"symbol\",\n \"from\": {\n \"data\": \"age_legend_stops\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 6\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"size\": {\n \"value\": 110\n },\n \"shape\": {\n \"value\": \"circle\"\n },\n \"stroke\": {\n \"value\": \"#FFFFFF\"\n },\n \"strokeWidth\": {\n \"value\": 1\n }\n },\n \"update\": {\n \"fill\": [\n {\n \"test\": \"datum.is_nodata\",\n \"value\": \"#BFDBFF\"\n },\n {\n \"scale\": \"age_color\",\n \"field\": \"val\"\n }\n ],\n \"opacity\": [\n {\n \"test\": \"metric == 'age'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"text\",\n \"from\": {\n \"data\": \"age_legend_stops\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 18\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"text\": {\n \"signal\": \"datum.label + ' (' + datum.count + ')'\"\n },\n \"opacity\": [\n {\n \"test\": \"metric == 'age'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n }\n ]\n },\n {\n \"type\": \"group\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"legendX\"\n },\n \"y\": {\n \"signal\": \"buttonsH + 8\"\n }\n }\n },\n \"marks\": [\n {\n \"type\": \"text\",\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 0\n },\n \"y\": {\n \"value\": 0\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": \"bold\"\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"text\": {\n \"signal\": \"'Depth (' + agg + ')'\"\n },\n \"opacity\": [\n {\n \"test\": \"metric == 'depth'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"symbol\",\n \"from\": {\n \"data\": \"depth_legend_stops\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 6\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"size\": {\n \"value\": 110\n },\n \"shape\": {\n \"value\": \"circle\"\n },\n \"stroke\": {\n \"value\": \"#FFFFFF\"\n },\n \"strokeWidth\": {\n \"value\": 1\n }\n },\n \"update\": {\n \"fill\": [\n {\n \"test\": \"datum.is_nodata\",\n \"value\": \"#BFDBFF\"\n },\n {\n \"scale\": \"depth_color\",\n \"field\": \"val\"\n }\n ],\n \"opacity\": [\n {\n \"test\": \"metric == 'depth'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n },\n {\n \"type\": \"text\",\n \"from\": {\n \"data\": \"depth_legend_stops\"\n },\n \"encode\": {\n \"enter\": {\n \"x\": {\n \"value\": 18\n },\n \"y\": {\n \"signal\": \"28 + (datum.idx - 1) * 22\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fill\": {\n \"value\": \"#838C99\"\n }\n },\n \"update\": {\n \"text\": {\n \"signal\": \"datum.label + ' (' + datum.count + ')'\"\n },\n \"opacity\": [\n {\n \"test\": \"metric == 'depth'\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ]\n }\n }\n }\n ]\n },\n {\n \"type\": \"group\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"tooltip.x + 18 + 290 > width - legendW - 10 ? max(tooltip.x - 18 - 290, 5) : tooltip.x + 18\"\n },\n \"y\": {\n \"signal\": \"max(tooltip.y - 30, 5)\"\n },\n \"width\": {\n \"value\": 290\n },\n \"height\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? 110 : 124) : 110\"\n },\n \"opacity\": [\n {\n \"test\": \"tooltip.entity_id\",\n \"value\": 1\n },\n {\n \"value\": 0\n }\n ],\n \"fill\": {\n \"value\": \"#0E1728\"\n },\n \"stroke\": {\n \"value\": \"#2A3144\"\n },\n \"strokeWidth\": {\n \"value\": 1\n },\n \"cornerRadius\": {\n \"value\": 8\n }\n }\n },\n \"marks\": [\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 12\n },\n \"y\": {\n \"value\": 12\n },\n \"text\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? [tooltip.entity_id] : [slice(tooltip.entity_id, 0, 36), slice(tooltip.entity_id, 36)]) : ['']\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"lineHeight\": {\n \"value\": 14\n },\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fontWeight\": {\n \"value\": \"bold\"\n },\n \"fill\": {\n \"value\": \"#fff\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 12\n },\n \"y\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? 36 : 50) : 36\"\n },\n \"text\": {\n \"signal\": \"tooltip.entity_id ? 'Status: ' + tooltip.status_label : ''\"\n },\n \"fontSize\": {\n \"value\": 10\n },\n \"fontWeight\": [\n {\n \"test\": \"metric == 'status'\",\n \"value\": \"bold\"\n },\n {\n \"value\": \"normal\"\n }\n ],\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fill\": {\n \"signal\": \"metric == 'status' ? (tooltip.status_num == 0 ? '#F6726A' : tooltip.status_num == 1 ? '#D6BF57' : tooltip.status_num == 2 ? '#24C292' : tooltip.status_num == 3 ? '#BFDBFF' : '#BFDBFF') : '#9da4b3'\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 12\n },\n \"y\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? 50 : 64) : 50\"\n },\n \"text\": {\n \"signal\": \"tooltip.entity_id ? 'Oldest age (' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last') + '): ' + (tooltip[('age_' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] != null ? format(tooltip[('age_' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))], ',d') + ' s' : 'Unknown') : ''\"\n },\n \"fontSize\": {\n \"value\": 10\n },\n \"fontWeight\": [\n {\n \"test\": \"metric == 'age'\",\n \"value\": \"bold\"\n },\n {\n \"value\": \"normal\"\n }\n ],\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fill\": {\n \"signal\": \"metric == 'age' ? (tooltip[('age_' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] == null ? '#9da4b3' : tooltip[('age_' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] >= 300 ? '#F6726A' : tooltip[('age_' + (metric === 'age' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] >= 60 ? '#D6BF57' : '#24C292') : '#9da4b3'\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 12\n },\n \"y\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? 64 : 78) : 64\"\n },\n \"text\": {\n \"signal\": \"tooltip.entity_id ? 'Depth (' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last') + '): ' + (tooltip[('depth_' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] != null ? format(tooltip[('depth_' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))], ',d') + '' : 'Unknown') : ''\"\n },\n \"fontSize\": {\n \"value\": 10\n },\n \"fontWeight\": [\n {\n \"test\": \"metric == 'depth'\",\n \"value\": \"bold\"\n },\n {\n \"value\": \"normal\"\n }\n ],\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fill\": {\n \"signal\": \"metric == 'depth' ? (tooltip[('depth_' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] == null ? '#9da4b3' : tooltip[('depth_' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] >= 1000 ? '#F6726A' : tooltip[('depth_' + (metric === 'depth' ? ((agg === 'min' || agg === 'max' || agg === 'avg' || agg === 'last') ? agg : 'last') : 'last'))] >= 100 ? '#D6BF57' : '#24C292') : '#9da4b3'\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"value\": 12\n },\n \"y\": {\n \"signal\": \"tooltip.entity_id ? (length(tooltip.entity_id) <= 36 ? 82 : 96) : 82\"\n },\n \"text\": {\n \"signal\": \"tooltip.entity_id ? '› Click for actions' : ''\"\n },\n \"fontSize\": {\n \"value\": 9\n },\n \"fontStyle\": {\n \"value\": \"italic\"\n },\n \"baseline\": {\n \"value\": \"top\"\n },\n \"fill\": {\n \"value\": \"#9da4b3\"\n }\n }\n }\n }\n ]\n },\n {\n \"type\": \"rect\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"(width - legendW) / 2 - 120\"\n },\n \"x2\": {\n \"signal\": \"(width - legendW) / 2 + 120\"\n },\n \"y\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2 - 45\"\n },\n \"y2\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2 + 45\"\n },\n \"fill\": {\n \"value\": \"#1A1C21\"\n },\n \"fillOpacity\": {\n \"signal\": \"(loading || loading_timeout) ? 0.92 : 0\"\n },\n \"stroke\": {\n \"value\": \"#838C99\"\n },\n \"strokeOpacity\": {\n \"signal\": \"(loading || loading_timeout) ? 0.4 : 0\"\n },\n \"strokeWidth\": {\n \"value\": 1\n },\n \"cornerRadius\": {\n \"value\": 12\n }\n }\n }\n },\n {\n \"type\": \"symbol\",\n \"interactive\": false,\n \"from\": {\n \"data\": \"spinner_dots\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"(width - legendW) / 2 + 18 * cos(datum.i * PI / 4 - PI / 2)\"\n },\n \"y\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2 - 8 + 18 * sin(datum.i * PI / 4 - PI / 2)\"\n },\n \"size\": {\n \"value\": 70\n },\n \"shape\": {\n \"value\": \"circle\"\n },\n \"fill\": {\n \"value\": \"#0077CC\"\n },\n \"opacity\": {\n \"signal\": \"loading ? 0.15 + 0.85 * (1 - (((floor(tick / 100) % 8) - datum.i + 8) % 8) / 7) : 0\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"(width - legendW) / 2\"\n },\n \"y\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2 + 28\"\n },\n \"text\": {\n \"value\": \"Loading data…\"\n },\n \"align\": {\n \"value\": \"center\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 12\n },\n \"fontWeight\": {\n \"value\": 500\n },\n \"fill\": {\n \"value\": \"#FFFFFF\"\n },\n \"opacity\": {\n \"signal\": \"loading && !loading_timeout ? 1 : 0\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"(width - legendW) / 2\"\n },\n \"y\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2 + 28\"\n },\n \"text\": {\n \"value\": \"Still loading… (taking longer than usual)\"\n },\n \"align\": {\n \"value\": \"center\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 12\n },\n \"fontWeight\": {\n \"value\": 500\n },\n \"fill\": {\n \"value\": \"#FFFFFF\"\n },\n \"opacity\": {\n \"signal\": \"loading_timeout ? 1 : 0\"\n }\n }\n }\n },\n {\n \"type\": \"text\",\n \"interactive\": false,\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"(width - legendW) / 2\"\n },\n \"y\": {\n \"signal\": \"buttonsH + (height - buttonsH) / 2\"\n },\n \"text\": {\n \"value\": \"No queues for the selected time range\"\n },\n \"align\": {\n \"value\": \"center\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 13\n },\n \"fontWeight\": {\n \"value\": 500\n },\n \"fill\": {\n \"value\": \"#838C99\"\n },\n \"opacity\": {\n \"signal\": \"no_data ? 1 : 0\"\n }\n }\n }\n },\n {\n \"name\": \"menu_backdrop\",\n \"type\": \"rect\",\n \"from\": {\n \"data\": \"menu_visible\"\n },\n \"encode\": {\n \"enter\": {\n \"cursor\": {\n \"value\": \"default\"\n }\n },\n \"update\": {\n \"x\": {\n \"value\": 0\n },\n \"y\": {\n \"value\": 0\n },\n \"x2\": {\n \"signal\": \"width\"\n },\n \"y2\": {\n \"signal\": \"height\"\n },\n \"fill\": {\n \"value\": \"#000000\"\n },\n \"fillOpacity\": {\n \"value\": 0\n }\n }\n }\n },\n {\n \"name\": \"menu_box\",\n \"type\": \"rect\",\n \"from\": {\n \"data\": \"menu_visible\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"menu_x\"\n },\n \"y\": {\n \"signal\": \"menu_y\"\n },\n \"width\": {\n \"value\": 248\n },\n \"height\": {\n \"value\": 90\n },\n \"fill\": {\n \"value\": \"#0E1728\"\n },\n \"stroke\": {\n \"value\": \"#2A3144\"\n },\n \"strokeWidth\": {\n \"value\": 1\n },\n \"cornerRadius\": {\n \"value\": 6\n }\n }\n }\n },\n {\n \"name\": \"menu_header\",\n \"type\": \"text\",\n \"interactive\": false,\n \"from\": {\n \"data\": \"menu_visible\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"menu_x + 12\"\n },\n \"y\": {\n \"signal\": \"menu_y + 13.0\"\n },\n \"text\": {\n \"signal\": \"selected_entity ? 'Queue: ' + (length(selected_entity.id) > 30 ? slice(selected_entity.id, 0, 28) + '…' : selected_entity.id) : ''\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 11\n },\n \"fontWeight\": {\n \"value\": 600\n },\n \"fill\": {\n \"value\": \"#98A2B3\"\n }\n }\n }\n },\n {\n \"name\": \"menu_separator\",\n \"type\": \"rule\",\n \"from\": {\n \"data\": \"menu_visible\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"menu_x + 8\"\n },\n \"x2\": {\n \"signal\": \"menu_x + 240\"\n },\n \"y\": {\n \"signal\": \"menu_y + 26\"\n },\n \"stroke\": {\n \"value\": \"#2A3144\"\n },\n \"strokeWidth\": {\n \"value\": 1\n }\n }\n }\n },\n {\n \"name\": \"menu_item_bg\",\n \"type\": \"rect\",\n \"from\": {\n \"data\": \"menu_items_visible\"\n },\n \"encode\": {\n \"enter\": {\n \"cursor\": {\n \"value\": \"pointer\"\n }\n },\n \"update\": {\n \"x\": {\n \"signal\": \"menu_x\"\n },\n \"y\": {\n \"signal\": \"menu_y + 30 + datum.idx * 30\"\n },\n \"width\": {\n \"value\": 248\n },\n \"height\": {\n \"value\": 30\n },\n \"fill\": {\n \"value\": \"#0E1728\"\n },\n \"href\": {\n \"signal\": \"selected_entity ? (datum.id === 'details' ? ('/app/dashboards#/view/aws_sqs_otel-3d6dd19d-9965-423b-a2c8-bd44a255b1eb?' + g_param + '_a=(filters:!((meta:(alias:!n,disabled:!f,index:%27metrics-*%27,key:QueueName,negate:!f,params:(query:%27' + selected_entity.id + '%27),type:phrase),query:(match_phrase:(QueueName:%27' + selected_entity.id + '%27))),(meta:(alias:!n,disabled:!f,index:%27metrics-*%27,key:cloud.region,negate:!f,params:(query:%27' + selected_entity.region + '%27),type:phrase),query:(match_phrase:(cloud.region:%27' + selected_entity.region + '%27)))),query:(language:kuery,query:%27%27))') : datum.id === 'metrics' ? ('/app/discover#/?_g=(time:(from:%27' + time_from + '%27,to:%27' + time_to + '%27))&_a=(dataSource:(dataViewId:%27metrics-*%27,type:dataView),filters:!((meta:(alias:!n,disabled:!f,index:%27metrics-*%27,key:QueueName,negate:!f,params:(query:%27' + selected_entity.id + '%27),type:phrase),query:(match_phrase:(QueueName:%27' + selected_entity.id + '%27))),(meta:(alias:!n,disabled:!f,index:%27metrics-*%27,key:cloud.region,negate:!f,params:(query:%27' + selected_entity.region + '%27),type:phrase),query:(match_phrase:(cloud.region:%27' + selected_entity.region + '%27)))),interval:auto,query:(language:kuery,query:%27%27),sort:!(!(%27@timestamp%27,desc)))') : null) : null\"\n }\n },\n \"hover\": {\n \"fill\": {\n \"value\": \"#1A2640\"\n }\n }\n }\n },\n {\n \"name\": \"menu_item_label\",\n \"type\": \"text\",\n \"interactive\": false,\n \"from\": {\n \"data\": \"menu_items_visible\"\n },\n \"encode\": {\n \"update\": {\n \"x\": {\n \"signal\": \"menu_x + 14\"\n },\n \"y\": {\n \"signal\": \"menu_y + 30 + datum.idx * 30 + 15.0\"\n },\n \"text\": {\n \"field\": \"label\"\n },\n \"align\": {\n \"value\": \"left\"\n },\n \"baseline\": {\n \"value\": \"middle\"\n },\n \"fontSize\": {\n \"value\": 12\n },\n \"fill\": {\n \"value\": \"#DFE5EF\"\n }\n }\n }\n }\n ],\n \"background\": \"transparent\",\n \"autosize\": {\n \"type\": \"fit\",\n \"contains\": \"padding\"\n }\n}" }, "title": "SQS queues — hexagon map", "type": "vega", @@ -602,7 +602,7 @@ ], "index": "5e246ab8c057c8bab1240f05d26d0aaebafbb2b7a678fc2aaf34bb4311b1fcad", "query": { - "esql": "SET unmapped_fields = \"nullify\";\nTS metrics-aws.sqs.otel-*\n| WHERE QueueName IS NOT NULL AND QueueName != \"\"\n| STATS last_seen = MAX(@timestamp)\n BY QueueName, cloud.region\n| INLINE STATS latest = MAX(last_seen)\n| WHERE DATE_DIFF(\"minutes\", last_seen, latest) <= 5\n| STATS total = COUNT(*)\n| KEEP total" + "esql": "SET unmapped_fields = \"nullify\";\nTS metrics-aws.sqs.otel-*\n| WHERE QueueName IS NOT NULL AND QueueName != \"\" AND stat == \"Sum\"\n| STATS last_seen = MAX(@timestamp)\n BY QueueName, cloud.region\n| INLINE STATS latest = MAX(last_seen)\n| WHERE DATE_DIFF(\"minutes\", last_seen, latest) <= 5\n| STATS total = COUNT(*)\n| KEEP total" }, "timeField": "@timestamp" } @@ -612,7 +612,7 @@ "filters": [], "needsRefresh": false, "query": { - "esql": "SET unmapped_fields = \"nullify\";\nTS metrics-aws.sqs.otel-*\n| WHERE QueueName IS NOT NULL AND QueueName != \"\"\n| STATS last_seen = MAX(@timestamp)\n BY QueueName, cloud.region\n| INLINE STATS latest = MAX(last_seen)\n| WHERE DATE_DIFF(\"minutes\", last_seen, latest) <= 5\n| STATS total = COUNT(*)\n| KEEP total" + "esql": "SET unmapped_fields = \"nullify\";\nTS metrics-aws.sqs.otel-*\n| WHERE QueueName IS NOT NULL AND QueueName != \"\" AND stat == \"Sum\"\n| STATS last_seen = MAX(@timestamp)\n BY QueueName, cloud.region\n| INLINE STATS latest = MAX(last_seen)\n| WHERE DATE_DIFF(\"minutes\", last_seen, latest) <= 5\n| STATS total = COUNT(*)\n| KEEP total" }, "visualization": { "applyColorTo": "background", @@ -1361,20 +1361,28 @@ "description": "All SQS queues, ranked worst-first by state. Click a queue to drill into its metrics. State reflects the latest values within a 5-minute freshness window. Sent, received, deleted, and empty-receives are totals summed over the selected time range; depth, in-flight, and oldest-message-age are peak (max) values over the range.", "drilldowns": [ { + "label": "1. View details", + "encode_url": false, + "open_in_new_tab": false, + "trigger": "on_click_row", + "type": "url_drilldown", + "url": "{{kibanaUrl}}/app/dashboards#/view/aws_sqs_otel-3d6dd19d-9965-423b-a2c8-bd44a255b1eb?_g=(time:(from:'{{context.panel.timeRange.from}}',to:'{{context.panel.timeRange.to}}'))&_a=(filters:!((meta:(alias:!n,disabled:!f,index:'metrics-*',key:QueueName,negate:!f,params:(query:'{{event.values.[0]}}'),type:phrase),query:(match_phrase:(QueueName:'{{event.values.[0]}}'))),(meta:(alias:!n,disabled:!f,index:'metrics-*',key:cloud.region,negate:!f,params:(query:'{{event.values.[4]}}'),type:phrase),query:(match_phrase:(cloud.region:'{{event.values.[4]}}')))),query:(language:kuery,query:''))" + }, + { + "label": "2. View metrics in Discover", "encode_url": false, - "label": "View raw SQS metric stream in Discover", "open_in_new_tab": true, - "trigger": "on_click_value", + "trigger": "on_click_row", "type": "url_drilldown", - "url": "{{kibanaUrl}}/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'{{context.panel.timeRange.from}}',to:'{{context.panel.timeRange.to}}'))&_a=(dataSource:(dataViewId:'metrics-*',type:dataView),filters:!((meta:(alias:!n,disabled:!f,index:'metrics-*',key:QueueName,negate:!f,params:(query:'{{event.value}}'),type:phrase),query:(match_phrase:(QueueName:'{{event.value}}')))),interval:auto,query:(language:kuery,query:'data_stream.dataset: \"aws.sqs\"'),sort:!(!('@timestamp',desc)))" + "url": "{{kibanaUrl}}/app/discover#/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:'{{context.panel.timeRange.from}}',to:'{{context.panel.timeRange.to}}'))&_a=(dataSource:(dataViewId:'metrics-*',type:dataView),filters:!((meta:(alias:!n,disabled:!f,index:'metrics-*',key:QueueName,negate:!f,params:(query:'{{event.values.[0]}}'),type:phrase),query:(match_phrase:(QueueName:'{{event.values.[0]}}'))),(meta:(alias:!n,disabled:!f,index:'metrics-*',key:cloud.region,negate:!f,params:(query:'{{event.values.[4]}}'),type:phrase),query:(match_phrase:(cloud.region:'{{event.values.[4]}}')))),interval:auto,query:(language:kuery,query:''),sort:!(!('@timestamp',desc)))" }, { + "label": "3. View in AWS console", "encode_url": false, - "label": "Open queue in AWS console", "open_in_new_tab": true, - "trigger": "on_click_value", + "trigger": "on_click_row", "type": "url_drilldown", - "url": "https://console.aws.amazon.com/sqs/v3/home#/queues/{{event.value}}" + "url": "https://{{event.values.[4]}}.console.aws.amazon.com/sqs/v3/home?region={{event.values.[4]}}#/queues/https%3A%2F%2Fsqs.{{event.values.[4]}}.amazonaws.com%2F{{event.values.[3]}}%2F{{event.values.[0]}}" } ], "title": "Queues" @@ -1908,7 +1916,7 @@ { "embeddableConfig": { "attributes": { - "description": "Peak age of the oldest message per queue over time (seconds, max per bucket). Reference line at 300s marks the staleness threshold. Top 10 queues by oldest-message age per bucket; spikes indicate consumers stalled or too slow.", + "description": "Peak age of the oldest message per queue over time (seconds, max per bucket). Top 10 queues by oldest-message age per bucket; spikes indicate consumers stalled or too slow.", "references": [], "state": { "adHocDataViews": { @@ -1929,26 +1937,6 @@ "datasourceStates": { "textBased": { "layers": { - "ref-age-300": { - "columns": [ - { - "columnId": "alert_threshold", - "customLabel": true, - "fieldName": "alert_threshold", - "inMetricDimension": true, - "label": "Old messages (300s)", - "meta": { - "esType": "integer", - "type": "number" - } - } - ], - "index": "5e246ab8c057c8bab1240f05d26d0aaebafbb2b7a678fc2aaf34bb4311b1fcad", - "query": { - "esql": "SET unmapped_fields = \"nullify\";\nROW alert_threshold = 300" - }, - "timeField": "@timestamp" - }, "xy-layer-chart-memory": { "columns": [ { @@ -2017,25 +2005,6 @@ "QueueName" ], "xAccessor": "timestamp" - }, - { - "accessors": [ - "alert_threshold" - ], - "layerId": "ref-age-300", - "layerType": "referenceLine", - "yConfig": [ - { - "axisMode": "left", - "color": "#bd271e", - "fill": "none", - "forAccessor": "alert_threshold", - "icon": "alert", - "iconPosition": "right", - "lineStyle": "dashed", - "lineWidth": 2 - } - ] } ], "legend": { @@ -2050,7 +2019,7 @@ "version": 2, "visualizationType": "lnsXY" }, - "description": "Peak age of the oldest message per queue over time (seconds, max per bucket). Reference line at 300s marks the staleness threshold. Top 10 queues by oldest-message age per bucket; spikes indicate consumers stalled or too slow.", + "description": "Peak age of the oldest message per queue over time (seconds, max per bucket). Top 10 queues by oldest-message age per bucket; spikes indicate consumers stalled or too slow.", "title": "Top 10 SQS queues by oldest message age (s)" }, "gridData": { @@ -2067,7 +2036,7 @@ { "embeddableConfig": { "attributes": { - "description": "Peak visible (ready-to-consume) messages per queue over time (max per bucket). Reference line at 1000 marks the backlog threshold. Top 10 queues by depth per bucket; sustained growth indicates consumers falling behind producers.", + "description": "Peak visible (ready-to-consume) messages per queue over time (max per bucket). Top 10 queues by depth per bucket; sustained growth indicates consumers falling behind producers.", "references": [], "state": { "adHocDataViews": { @@ -2088,26 +2057,6 @@ "datasourceStates": { "textBased": { "layers": { - "ref-depth-1000": { - "columns": [ - { - "columnId": "alert_threshold", - "customLabel": true, - "fieldName": "alert_threshold", - "inMetricDimension": true, - "label": "High queue depth (1000)", - "meta": { - "esType": "integer", - "type": "number" - } - } - ], - "index": "5e246ab8c057c8bab1240f05d26d0aaebafbb2b7a678fc2aaf34bb4311b1fcad", - "query": { - "esql": "SET unmapped_fields = \"nullify\";\nROW alert_threshold = 1000" - }, - "timeField": "@timestamp" - }, "xy-layer-chart-cpu": { "columns": [ { @@ -2176,25 +2125,6 @@ "QueueName" ], "xAccessor": "timestamp" - }, - { - "accessors": [ - "alert_threshold" - ], - "layerId": "ref-depth-1000", - "layerType": "referenceLine", - "yConfig": [ - { - "axisMode": "left", - "color": "#bd271e", - "fill": "none", - "forAccessor": "alert_threshold", - "icon": "alert", - "iconPosition": "right", - "lineStyle": "dashed", - "lineWidth": 2 - } - ] } ], "legend": { @@ -2209,7 +2139,7 @@ "version": 2, "visualizationType": "lnsXY" }, - "description": "Peak visible (ready-to-consume) messages per queue over time (max per bucket). Reference line at 1000 marks the backlog threshold. Top 10 queues by depth per bucket; sustained growth indicates consumers falling behind producers.", + "description": "Peak visible (ready-to-consume) messages per queue over time (max per bucket). Top 10 queues by depth per bucket; sustained growth indicates consumers falling behind producers.", "title": "Top 10 SQS queues by depth (visible messages)" }, "gridData": { diff --git a/packages/aws_sqs_otel/manifest.yml b/packages/aws_sqs_otel/manifest.yml index 090a998074d..923579cba04 100644 --- a/packages/aws_sqs_otel/manifest.yml +++ b/packages/aws_sqs_otel/manifest.yml @@ -1,7 +1,7 @@ format_version: 3.6.0 name: aws_sqs_otel title: "AWS SQS Metrics OpenTelemetry Assets" -version: 0.12.0 +version: 0.13.0 source: license: "Elastic-2.0" description: "AWS SQS Metrics OpenTelemetry Assets"