From 1010efcb5f19324f19dd0cf688c4115262006e5e Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Thu, 12 Feb 2026 23:12:46 +0100 Subject: [PATCH 01/20] draft example for kafka async agent and pubsub --- messaging/README.md | 44 + messaging/clients/consumers/kaf_consume.sh | 8 + messaging/clients/producers/kaf.sh | 26 + messaging/clients/producers/kaf_payload.json | 5 + .../grafana/dashboards/all.yml | 11 + .../grafana/datasources/prometheus-tempo.yml | 35 + .../grafana/krakend/for-prometheus.json | 8632 +++++++++++++++++ .../kibana/dashboard.ndjson | 4 + .../logstash/logstash.conf | 36 + .../prometheus/prometheus.yml | 18 + .../telemetry-dashboards/tempo/tempo.yaml | 60 + messaging/docker-compose.yaml | 84 + messaging/startup.sh | 40 + 13 files changed, 9003 insertions(+) create mode 100644 messaging/README.md create mode 100755 messaging/clients/consumers/kaf_consume.sh create mode 100755 messaging/clients/producers/kaf.sh create mode 100644 messaging/clients/producers/kaf_payload.json create mode 100644 messaging/config/telemetry-dashboards/grafana/dashboards/all.yml create mode 100644 messaging/config/telemetry-dashboards/grafana/datasources/prometheus-tempo.yml create mode 100644 messaging/config/telemetry-dashboards/grafana/krakend/for-prometheus.json create mode 100644 messaging/config/telemetry-dashboards/kibana/dashboard.ndjson create mode 100644 messaging/config/telemetry-dashboards/logstash/logstash.conf create mode 100644 messaging/config/telemetry-dashboards/prometheus/prometheus.yml create mode 100644 messaging/config/telemetry-dashboards/tempo/tempo.yaml create mode 100644 messaging/docker-compose.yaml create mode 100755 messaging/startup.sh diff --git a/messaging/README.md b/messaging/README.md new file mode 100644 index 0000000..ccf563f --- /dev/null +++ b/messaging/README.md @@ -0,0 +1,44 @@ +# Messaging + +## Environment + +To launch the test environment, just execute: + +``` +docker compose up -d +``` + +It will bring up the following services: + +- `kafkabroker`: a single node kafka broker +- `seckafkabroker`: a single node + +Along with services for telemetry: + +- `grafana` +- `tempo` +- `prometheus` + +[##](##) Producing messages + +In order to produce messages you will need to have installed the +`kaf` tool. + +# TODO: explain how to install the kaf tool + +## "Story Telling" + +The `kafkabroker` is a source of information for different market +prices updates, so, we create a couple of topics where we will +publish some data: + +- `stockprice`: some stock we are tracking + +The `seckafkabroker` is our secure connection to the bank to place +market orders, and get updates of the status of our portfolio, so, +we secure it with a mTLS connection: a certificate is required to +connect to it. + +- `orderplacement` +- `portfolioupdates` + diff --git a/messaging/clients/consumers/kaf_consume.sh b/messaging/clients/consumers/kaf_consume.sh new file mode 100755 index 0000000..775519a --- /dev/null +++ b/messaging/clients/consumers/kaf_consume.sh @@ -0,0 +1,8 @@ +#/bin/bash + +export KTOPIC=stockprices + +kaf consume \ + ${KTOPIC} \ + -v \ + -b localhost:9092 diff --git a/messaging/clients/producers/kaf.sh b/messaging/clients/producers/kaf.sh new file mode 100755 index 0000000..1e16b60 --- /dev/null +++ b/messaging/clients/producers/kaf.sh @@ -0,0 +1,26 @@ +#/bin/bash + +KTOPIC=stockprice +KADDRESS=shrimp.ln:9092 + +echo -e "Producing: $KKEY into '$KTOPIC' topic\n" + +SLEEP_PERIOD=5 +PRICES=("309.28", "312.59", "315.7", "314.68", "311.9", "309.70", "319.00") + + +for p in ${PRICES[@]}; do + echo "producing price ${p}" + export PRICE=$p + export KKEY=$(date +%Y%m%d_%H%M%S) + envsubst < kaf_payload.json | \ + kaf produce \ + ${KTOPIC} \ + -H Content-Type:application/json \ + -k ${KKEY} \ + -b ${KADDRESS} \ + -v \ + --input-mode full + sleep ${SLEEP_PERIOD} +done + diff --git a/messaging/clients/producers/kaf_payload.json b/messaging/clients/producers/kaf_payload.json new file mode 100644 index 0000000..7188519 --- /dev/null +++ b/messaging/clients/producers/kaf_payload.json @@ -0,0 +1,5 @@ +{ + "ticker": "AAPL", + "price": "${PRICE}", + "name": "Apple Inc" +} diff --git a/messaging/config/telemetry-dashboards/grafana/dashboards/all.yml b/messaging/config/telemetry-dashboards/grafana/dashboards/all.yml new file mode 100644 index 0000000..79b1687 --- /dev/null +++ b/messaging/config/telemetry-dashboards/grafana/dashboards/all.yml @@ -0,0 +1,11 @@ +apiVersion: 1 + +providers: +- name: 'default' + orgId: 1 + folder: '' + type: file + disableDeletion: false + updateIntervalSeconds: 60 + options: + path: /var/lib/grafana/dashboards/krakend diff --git a/messaging/config/telemetry-dashboards/grafana/datasources/prometheus-tempo.yml b/messaging/config/telemetry-dashboards/grafana/datasources/prometheus-tempo.yml new file mode 100644 index 0000000..9a04355 --- /dev/null +++ b/messaging/config/telemetry-dashboards/grafana/datasources/prometheus-tempo.yml @@ -0,0 +1,35 @@ +apiVersion: 1 + +datasources: +- access: proxy + id: 1 + orgId: 1 + name: Prometheus + type: prometheus + typeName: Prometheus + url: http://prometheus:9090 + user: "" + database: "" + basicAuth: false + isDefault: true + jsonData: + httpMethod: POST + readOnly: false + editable: true + # This UID matches the one used in the dashboard settings file + uid: krakend_prometheus_datasource +- access: proxy + id: 2 + orgId: 1 + name: Tempo + type: tempo + typeName: Tempo + url: http://tempo:3200 + user: "" + database: "" + basicAuth: false + isDefault: false + jsonData: {} + readOnly: false + editable: true + uid: krakend_tempo_datasource \ No newline at end of file diff --git a/messaging/config/telemetry-dashboards/grafana/krakend/for-prometheus.json b/messaging/config/telemetry-dashboards/grafana/krakend/for-prometheus.json new file mode 100644 index 0000000..2b80913 --- /dev/null +++ b/messaging/config/telemetry-dashboards/grafana/krakend/for-prometheus.json @@ -0,0 +1,8632 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "description": "KrakenD dashboard based on Prometheus integration via OpenTelemetry", + "editable": true, + "fiscalYearStartMonth": 0, + "gnetId": 20651, + "graphTooltip": 0, + "id": 1, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 8, + "panels": [], + "title": "Overview", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Total incoming HTTP Requests in the selected period", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "transparent", + "mode": "fixed" + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 0, + "y": 1 + }, + "id": 28, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "sum(delta(http_server_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__range]))\n", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A", + "useBackend": false + } + ], + "title": "Total HTTP Requests", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Average requests per second over the selected period", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "green", + "mode": "fixed" + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 3, + "y": 1 + }, + "id": 39, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "sum(max_over_time(http_server_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__range])-min_over_time(http_server_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__range]))/ $__range_s", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg Throughput", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The Average Response Time in the selected period", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 6, + "y": 1 + }, + "id": 31, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(rate(http_server_duration_sum{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__range])) / (sum(rate(http_server_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__range]))+0.0001)", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg Response Time", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Total number of proxy requests", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "transparent", + "mode": "fixed" + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 9, + "y": 1 + }, + "id": 29, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "sum(delta(krakend_proxy_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__range]))\n", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A", + "useBackend": false + } + ], + "title": "Total Proxy Requests", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Total number of attempted connections to backends (failed or not)", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "transparent", + "mode": "fixed" + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 12, + "y": 1 + }, + "id": 30, + "options": { + "colorMode": "background", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "sum(delta(krakend_backend_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__range]))\n", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "__auto", + "range": false, + "refId": "A", + "useBackend": false + } + ], + "title": "Total Backend Requests", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Average allocated memory per instance", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "decimals": 0, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 15, + "y": 1 + }, + "id": 77, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(avg_over_time(go_memstats_alloc_bytes{app=~\"$app\", instance=~\"$instance\"}[$__range]))/count(max_over_time(go_memstats_alloc_bytes{app=~\"$app\", instance=~\"$instance\"}[$__range]))", + "hide": false, + "range": true, + "refId": "A" + } + ], + "title": "Avg memory in use", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "An average of the total memory reserved per instance in the period", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "decimals": 0, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 18, + "y": 1 + }, + "id": 80, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(avg_over_time(go_memstats_sys_bytes{app=~\"$app\", instance=~\"$instance\"}[$__range]))/count(max_over_time(go_memstats_sys_bytes{app=~\"$app\", instance=~\"$instance\"}[$__range]))", + "hide": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A" + } + ], + "title": "Reserved memory", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Total number of Go routines (internal threads) running in the gateway per instance. Go routines manage the incoming traffic, background operations and other maintenance tasks.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "decimals": 0, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 21, + "y": 1 + }, + "id": 78, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(avg_over_time(go_goroutines{app=~\"$app\", instance=~\"$instance\"}[$__range]))/count(max_over_time(go_goroutines{app=~\"$app\", instance=~\"$instance\"}[$__range]))", + "hide": false, + "range": true, + "refId": "A" + } + ], + "title": "Go Routines", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The worst latency seen during the selected time", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 0, + "y": 6 + }, + "id": 79, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(1, sum by(le) (rate(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\",http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Worst latency", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 99 tells you that 99% of HTTP server requests have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 3, + "y": 6 + }, + "id": 59, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.99, sum by(le) (rate(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\",http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Latency p99", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 95 tells you that 95% of HTTP server requests have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 6, + "y": 6 + }, + "id": 60, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le) (rate(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\",http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Latency p95", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 90 tells you that 90% of HTTP server requests have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 9, + "y": 6 + }, + "id": 61, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.90, sum by(le) (rate(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\",http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Latency p90", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 75 tells you that 75% of HTTP server requests have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 12, + "y": 6 + }, + "id": 62, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.75, sum by(le) (rate(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\",http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Latency p75", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 50 tells you that 50% of HTTP server requests have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 15, + "y": 6 + }, + "id": 63, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.5, sum by(le) (rate(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\",http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Latency p50", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Average response size of data payloads per second in the selected period", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 18, + "y": 6 + }, + "id": 110, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(rate(http_server_response_size_sum{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg data throughput", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Pie chart of status codes.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "palette-classic" + }, + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + } + }, + "mappings": [], + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 3, + "x": 21, + "y": 6 + }, + "id": 27, + "interval": "$interval", + "options": { + "legend": { + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "pieType": "donut", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(http_response_status_code) (delta(http_server_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__range]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Response Status Codes Distribution", + "type": "piechart" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Numer of request per second received", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 21, + "x": 0, + "y": 11 + }, + "id": 64, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(rate(http_server_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Throughput (RPS)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Average response latency", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "noValue": "-", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 18 + }, + "id": 98, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(rate(http_server_duration_sum{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval]))/count(max_over_time(http_server_duration_sum{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg Latency", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentiles tell you the percentage of requests that responded within a time.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "noValue": "-", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 18 + }, + "id": 65, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.99, sum by(le) (delta(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "p99", + "range": true, + "refId": "A", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le) (delta(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval])))", + "hide": false, + "instant": false, + "legendFormat": "p95", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "histogram_quantile(0.9, sum by(le) (delta(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval])))", + "hide": false, + "instant": false, + "legendFormat": "p90", + "range": true, + "refId": "C" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "histogram_quantile(0.75, sum by(le) (delta(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval])))", + "hide": false, + "instant": false, + "legendFormat": "p75", + "range": true, + "refId": "D" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "histogram_quantile(0.5, sum by(le) (delta(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval])))", + "hide": false, + "instant": false, + "legendFormat": "p50", + "range": true, + "refId": "E" + } + ], + "title": "Latencies (Percentile)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Bytes sent in body responses during the selected period. Headers excluded.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 26 + }, + "id": 66, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(rate(http_server_response_size_sum{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Response data size (payloads)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Average response size of data payloads in the selected period", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 26 + }, + "id": 67, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(rate(http_server_response_size_sum{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval]) / (1 +rate(http_server_response_size_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg reponse data size (payloads)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The worst proxy execution has a latency matching this number", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 0, + "y": 35 + }, + "id": 11, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(1, sum by(le) (rate(krakend_proxy_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Worst proxy latency", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 99 tells you that 99% of the proxy executions have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 3, + "y": 35 + }, + "id": 81, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.99, sum by(le) (rate(krakend_proxy_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Proxy latency 99p", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 95 tells you that 95% of the proxy executions have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 6, + "y": 35 + }, + "id": 69, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le) (rate(krakend_proxy_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Proxy latency 95p", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 90 tells you that 90% of the proxy executions have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 9, + "y": 35 + }, + "id": 70, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.90, sum by(le) (rate(krakend_proxy_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Proxy latency 90p", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 75 tells you that 75% of the proxy executions have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 12, + "y": 35 + }, + "id": 71, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.75, sum by(le) (rate(krakend_proxy_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Proxy latency 75p", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 50 tells you that 50% of the proxy executions have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 15, + "y": 35 + }, + "id": 72, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.5, sum by(le) (rate(krakend_proxy_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Proxy latency 50p", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Number of incomplete responses returned to the user on aggregation (matches X-KrakenD-Complete header)", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 18, + "y": 35 + }, + "id": 85, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(rate(krakend_proxy_duration_count{complete=\"false\",app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Incomplete responses per second", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Number of proxy errors per second seen in the selected period", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "dark-red", + "mode": "thresholds" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 21, + "y": 35 + }, + "id": 83, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(rate(krakend_proxy_duration_count{error=\"true\",app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Proxy errors per second", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The worst backend connection has a latency matching this number", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 0, + "y": 40 + }, + "id": 12, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.99, sum by(le) (rate(krakend_backend_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Worst backend latency", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 99 tells you that 99% of the backend connections have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 3, + "y": 40 + }, + "id": 82, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.99, sum by(le) (rate(krakend_backend_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Backend latency 99p", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 95 tells you that 95% of the backend connections have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 6, + "y": 40 + }, + "id": 73, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le) (rate(krakend_backend_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Backend latency 95p", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 90 tells you that 90% of the backend connections have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 9, + "y": 40 + }, + "id": 74, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.9, sum by(le) (rate(krakend_backend_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Backend latency 90p", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 75 tells you that 75% of the backend connections have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 12, + "y": 40 + }, + "id": 75, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.75, sum by(le) (rate(krakend_backend_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Backend latency 75p", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The percentile 50 tells you that 50% of the backend connections have a latency below this number.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 15, + "y": 40 + }, + "id": 76, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.5, sum by(le) (rate(krakend_backend_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Backend latency 50p", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The average response size of backends within a second", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 18, + "y": 40 + }, + "id": 87, + "options": { + "colorMode": "none", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(rate(http_client_response_size_sum{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\", http_response_status_code=~\"[24]\\\\d{2}\"}[$__rate_interval])/rate(http_client_response_size_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\", http_response_status_code=~\"[24]\\\\d{2}\"}[$__rate_interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg backend traffic", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Number of backend errors per second seen in the selected period", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "dark-red", + "mode": "thresholds" + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 1 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 3, + "x": 21, + "y": 40 + }, + "id": 86, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(rate(krakend_backend_duration_count{error=\"true\",app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Backend errors per second", + "type": "stat" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 45 + }, + "id": 4, + "panels": [], + "title": "Global", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Numer of request per second received", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 46 + }, + "id": 5, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rate(http_server_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval])", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Throughput (RPS)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Average response latency", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "noValue": "-", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 54 + }, + "id": 101, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by (http_request_method, http_route) (rate(http_server_duration_sum{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval]))/sum by (http_request_method, http_route) (rate(http_server_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg Latency", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The 95 percentile tells you that 95% of the requests responded within this time.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 54 + }, + "id": 33, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le, http_route, http_request_method) (rate(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "95p Endpoint Latencies", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Bytes sent in body responses during the selected period. Headers excluded.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 62 + }, + "id": 100, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rate(http_server_response_size_sum{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval])", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg response size per endpoint", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Average bytes sent in body responses for each endpoint during the selected period. Headers excluded.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 16, + "w": 12, + "x": 12, + "y": 62 + }, + "id": 35, + "options": { + "displayMode": "gradient", + "maxVizHeight": 300, + "minVizHeight": 10, + "minVizWidth": 0, + "namePlacement": "auto", + "orientation": "horizontal", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + }, + "showUnfilled": true, + "sizing": "auto", + "valueMode": "color" + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "rate(http_server_response_size_sum{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval]) / rate(http_server_response_size_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval])", + "format": "time_series", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "interval": "", + "legendFormat": "{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Average response size per endpoint", + "type": "bargauge" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Bytes sent in body responses during the selected period. Headers excluded.", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "gauge" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "http_route" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 70 + }, + "id": 68, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": [ + "Value" + ], + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true, + "sortBy": [ + { + "desc": false, + "displayName": "Value" + } + ] + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "exemplar": false, + "expr": "topk($max_list, histogram_quantile(0.95, sum by (le, http_route) (rate(http_server_response_size_bucket{app=~\"$app\", instance=~\"$instance\"}[$__range])))) >= 0", + "format": "table", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "{{http_route}}", + "range": false, + "refId": "A", + "useBackend": false + } + ], + "title": "Total response size per endpoint (top $max_list)", + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Fastest endpoints to respond", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "gauge" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "http_route" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 78 + }, + "id": 26, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": [ + "Value" + ], + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "bottomk($max_list, histogram_quantile(0.95, sum by (le, http_route) (rate(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route!=\"\"}[$__range])))) >= 0", + "format": "table", + "instant": true, + "legendFormat": "{{http_route}}", + "range": false, + "refId": "A" + } + ], + "title": "Fastest p95 endpoints (top $max_list)", + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Slowest endpoints to respond", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "gauge" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "http_route" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 78 + }, + "id": 88, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": [ + "Value" + ], + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk($max_list, histogram_quantile(0.95, sum by (le, http_route) (rate(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route!=\"\"}[$__range])))) >= 0", + "format": "table", + "instant": true, + "legendFormat": "{{http_route}}", + "range": false, + "refId": "A" + } + ], + "title": "Slowest p95 endpoints (top $max_list)", + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Count of HTTP response status codes over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 86 + }, + "id": 21, + "interval": "$interval", + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(http_response_status_code) (delta(http_server_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Response Status Codes", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Distribution of status codes over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 86 + }, + "id": 24, + "interval": "$interval", + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(http_response_status_code) (delta(http_server_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Response Status Codes", + "type": "timeseries" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "timeseries", + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Histogram showing the latency of responses over time.", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 94 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 36, + "interval": "$interval", + "legend": { + "show": false + }, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true, + "showLegend": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "s" + } + }, + "pluginVersion": "10.4.0", + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(increase(http_server_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__interval])) by (le)\n", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Latency Heat Map", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "format": "short", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "timeseries", + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Histogram showing the size of payloads of responses over time.", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 12, + "y": 94 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 38, + "interval": "$interval", + "legend": { + "show": false + }, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true, + "showLegend": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "bytes" + } + }, + "pluginVersion": "10.4.0", + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(increase(http_server_response_size_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__interval])) by (le)\n", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Response Size Heat Map", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "format": "short", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 106 + }, + "id": 3, + "panels": [], + "title": "Proxy", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Numer of request per second received", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 107 + }, + "id": 40, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rate(krakend_proxy_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval])", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Throughput (RPS)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The Endpoints Average Latency", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 115 + }, + "id": 41, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by (http_request_method, http_route) (rate(krakend_proxy_duration_sum{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval]))/sum by (http_request_method, http_route) (rate(krakend_proxy_duration_count{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg Endpoint Latencies", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The Endpoint p95 Latencies", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 115 + }, + "id": 99, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le, http_route, http_request_method) (rate(krakend_proxy_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "95p Endpoint Latencies", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Fastest endpoints by looking at the percentile 95", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "gauge" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "http_route" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 123 + }, + "id": 42, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": [ + "Value" + ], + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "bottomk($max_list, histogram_quantile(0.95, sum by (le, http_route) (rate(krakend_proxy_duration_bucket{app=~\"$app\", instance=~\"$instance\"}[$__range])))) >= 0", + "format": "table", + "instant": true, + "legendFormat": "{{url_path}}", + "range": false, + "refId": "A" + } + ], + "title": "Fastest endpoints (p95 - top $max_list)", + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Slowest endpoints by looking at the percentile 95", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "gauge" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "http_route" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 123 + }, + "id": 89, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": [ + "Value" + ], + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk($max_list, histogram_quantile(0.95, sum by (le, http_route) (rate(krakend_proxy_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route!=\"\"}[$__range])))) >= 0", + "format": "table", + "instant": true, + "legendFormat": "{{url_path}}", + "range": false, + "refId": "A" + } + ], + "title": "Slowest endpoints (p95 - top $max_list)", + "type": "table" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "timeseries", + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The latency heatmap", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 24, + "x": 0, + "y": 131 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 44, + "interval": "$interval", + "legend": { + "show": false + }, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true, + "showLegend": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "s" + } + }, + "pluginVersion": "10.4.0", + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(increase(krakend_proxy_duration_bucket{app=~\"$app\", instance=~\"$instance\", http_route=~\"$endpoint\"}[$__interval])) by (le)\n", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Latency Heat Map", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "format": "short", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 144 + }, + "id": 2, + "panels": [], + "title": "Backends", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Number of BACKEND request per second executed", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "reqps" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 145 + }, + "id": 45, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rate(http_client_duration_count{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$interval])", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{server_address}}{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Throughput (RPS)", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 12, + "x": 0, + "y": 156 + }, + "id": 1, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(http_request_method, http_route, server_address) (rate(http_client_duration_sum{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))/sum by(http_request_method, http_route, server_address) (rate(http_client_duration_count{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "{{http_request_method}} {{server_address}}{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg requests latency", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The time it takes for a request to have the first byte of the response body ready to be read.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 12, + "x": 12, + "y": 156 + }, + "id": 46, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le, http_route, http_request_method, server_address) (rate(http_client_duration_bucket{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{server_address}}{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "95p Backend Request Duration", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Number of bytes reported by consumed responses Content-Length values. In case of chunked responses, the metrics are not displayed here.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 8, + "x": 0, + "y": 167 + }, + "id": 47, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rate(http_client_response_size_sum{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$interval])", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{server_address}}{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Received Content Length", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Backends that did not report a Content-Length header", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 8, + "x": 8, + "y": 167 + }, + "id": 55, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rate(http_client_response_no_content_length_total{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$interval])", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{server_address}}{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "No Content Length Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Average response content-lenght. Chunked responses are not taken into account.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 8, + "x": 16, + "y": 167 + }, + "id": 48, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rate(http_client_response_size_sum{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$interval]) / rate(http_client_response_size_count{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$interval])", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{server_address}}{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Average Content Length", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Number of bytes readed from the body. In case a cancel, or a closed connection, the read bytes might not match those of content-lenght. This metric includes chunked responses that do not come with the Content-Length header set.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 0, + "y": 179 + }, + "id": 56, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rate(http_client_request_read_size_hist_sum{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$interval])", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{server_address}}{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Read Content Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Average Number of bytes readed from the body. In case a cancel, or a closed connection, the read bytes might not match those of content-lenght. This metric includes chunked responses that do not come with the Content-Length header set.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 12, + "w": 12, + "x": 12, + "y": 179 + }, + "id": 57, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "rate(http_client_request_read_size_hist_sum{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$interval]) / rate(http_client_request_read_size_hist_count{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$interval])", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "{{http_request_method}} {{server_address}}{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg Read Content Size", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Fastest backend response times p95", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "gauge" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "http_route" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "http_request_method" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "server_address" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 191 + }, + "id": 49, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": [ + "Value" + ], + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "bottomk($max_list, histogram_quantile(0.95, sum by (le, http_route, http_request_method, server_address) (rate(http_client_duration_bucket{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\", http_route!=\"\"}[$__range])))) >= 0", + "format": "table", + "instant": true, + "legendFormat": "{{http_route}}", + "range": false, + "refId": "A" + } + ], + "title": "Fastest p95 endpoints (top $max_list)", + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Slowest backend tesponse times p95", + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "align": "auto", + "cellOptions": { + "type": "gauge" + }, + "inspect": false + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "s" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Time" + }, + "properties": [ + { + "id": "custom.hidden", + "value": true + }, + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "http_route" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "http_request_method" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "server_address" + }, + "properties": [ + { + "id": "custom.cellOptions", + "value": { + "type": "auto" + } + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 191 + }, + "id": 90, + "options": { + "cellHeight": "sm", + "footer": { + "countRows": false, + "fields": [ + "Value" + ], + "reducer": [ + "sum" + ], + "show": false + }, + "showHeader": true + }, + "pluginVersion": "10.4.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "exemplar": false, + "expr": "topk($max_list, histogram_quantile(0.95, sum by (le, http_route, server_address, http_request_method) (rate(http_client_duration_bucket{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\", http_route!=\"\"}[$__range])))) >= 0", + "format": "table", + "instant": true, + "legendFormat": "{{http_route}}", + "range": false, + "refId": "A" + } + ], + "title": "Slowest p95 endpoints (top $max_list)", + "type": "table" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "noValue": "No Response", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 199 + }, + "id": 51, + "interval": "$interval", + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(http_response_status_code) (delta(http_client_duration_count{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Response Status Codes Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "percent" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 199 + }, + "id": 52, + "interval": "$interval", + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(http_response_status_code) (delta(http_client_duration_count{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Response Status Codes Distribution", + "type": "timeseries" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "timeseries", + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The BACKEND requests latency heatmap", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 12, + "x": 0, + "y": 208 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 53, + "interval": "$interval", + "legend": { + "show": false + }, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true, + "showLegend": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "s" + } + }, + "pluginVersion": "10.4.0", + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(increase(http_client_duration_bucket{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__interval])) by (le)\n", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Latency Heat Map", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "format": "short", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "cards": {}, + "color": { + "cardColor": "#b4ff00", + "colorScale": "sqrt", + "colorScheme": "interpolateOranges", + "exponent": 0.5, + "mode": "spectrum" + }, + "dataFormat": "timeseries", + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "The Response Size Heatmap", + "fieldConfig": { + "defaults": { + "custom": { + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "scaleDistribution": { + "type": "linear" + } + } + }, + "overrides": [] + }, + "gridPos": { + "h": 13, + "w": 12, + "x": 12, + "y": 208 + }, + "heatmap": {}, + "hideZeroBuckets": false, + "highlightCards": true, + "id": 54, + "interval": "$interval", + "legend": { + "show": false + }, + "options": { + "calculate": false, + "cellGap": 1, + "color": { + "exponent": 0.5, + "fill": "dark-orange", + "mode": "scheme", + "reverse": false, + "scale": "exponential", + "scheme": "Oranges", + "steps": 64 + }, + "exemplars": { + "color": "rgba(255,0,255,0.7)" + }, + "filterValues": { + "le": 1e-9 + }, + "legend": { + "show": true, + "showLegend": true + }, + "rowsFrame": { + "layout": "auto" + }, + "tooltip": { + "mode": "single", + "showColorScale": false, + "yHistogram": false + }, + "yAxis": { + "axisPlacement": "left", + "reverse": false, + "unit": "bytes" + } + }, + "pluginVersion": "10.4.0", + "reverseYBuckets": false, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(increase(http_client_response_size_bucket{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__interval])) by (le)\n", + "format": "heatmap", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Response Size Heat Map", + "tooltip": { + "show": true, + "showHistogram": false + }, + "type": "heatmap", + "xAxis": { + "show": true + }, + "yAxis": { + "format": "short", + "logBase": 1, + "show": true + }, + "yBucketBound": "auto" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Failed and timed out requests.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 0, + "y": 221 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(rate(http_client_request_failed_count_total{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "Failed", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(rate(http_client_request_timedout_count_total{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "Timed out", + "range": true, + "refId": "C" + } + ], + "title": "Failed and Timed out", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Requests started vs canceled.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 221 + }, + "id": 17, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "10.2.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(rate(http_client_request_started_count_total{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "Started", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(rate(http_client_request_canceled_count_total{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "Cancelled", + "range": true, + "refId": "C" + } + ], + "title": "Started vs Canceled", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 12, + "x": 0, + "y": 230 + }, + "id": 18, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le) (rate(http_client_request_get_conn_duration_bucket{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval])))", + "instant": false, + "legendFormat": "Get Conn", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le) (rate(http_client_request_dns_duration_bucket{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "DNS", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le) (rate(http_client_request_tls_duration_bucket{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval])))", + "hide": false, + "instant": false, + "legendFormat": "TLS", + "range": true, + "refId": "C" + } + ], + "title": "Requests Details p95", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 12, + "x": 12, + "y": 230 + }, + "id": 102, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(rate(http_client_request_get_conn_duration_sum{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))/sum(rate(http_client_request_get_conn_duration_count{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))", + "instant": false, + "legendFormat": "Get Conn", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum(rate(http_client_request_dns_duration_sum{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))/sum(rate(http_client_request_dns_duration_count{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))", + "fullMetaSearch": false, + "hide": false, + "includeNullMetadata": false, + "instant": false, + "legendFormat": "DNS", + "range": true, + "refId": "B", + "useBackend": false + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(rate(http_client_request_tls_duration_sum{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))/sum(rate(http_client_request_tls_duration_count{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))", + "hide": false, + "instant": false, + "legendFormat": "TLS", + "range": true, + "refId": "C" + } + ], + "title": "Avg Request Times", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 12, + "x": 0, + "y": 241 + }, + "id": 13, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "sum by(http_route, http_request_method, server_address) (rate(krakend_backend_duration_sum{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))/sum by(http_route, http_request_method, server_address) (rate(krakend_backend_duration_count{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval]))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "{{http_request_method}} {{server_address}}{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Avg backend duration", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Percentile 95 of backend duration", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 12, + "x": 12, + "y": 241 + }, + "id": 103, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "disableTextWrap": false, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le, http_route, http_request_method, server_address) (rate(krakend_backend_duration_bucket{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval])))", + "fullMetaSearch": false, + "includeNullMetadata": false, + "instant": true, + "legendFormat": "{{http_request_method}} {{server_address}}{{http_route}}", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "p95 backend duration", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Number of requests initiated", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 11, + "w": 24, + "x": 0, + "y": 252 + }, + "id": 15, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": " sum by (http_request_method, krakend_endpoint_route, server_address, http_route) (rate(http_client_request_started_count_total{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[1m]))", + "instant": false, + "legendFormat": "{{http_request_method}} {{http_route}}", + "range": true, + "refId": "A" + } + ], + "title": "Requests Started Count", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 25, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "decbytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 6, + "w": 24, + "x": 0, + "y": 263 + }, + "id": 19, + "options": { + "legend": { + "calcs": [], + "displayMode": "table", + "placement": "right", + "showLegend": false + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "histogram_quantile(0.95, sum by(le) (rate(http_client_response_size_bucket{app=~\"$app\", instance=~\"$instance\", krakend_endpoint_route=~\"$endpoint\"}[$__rate_interval])))", + "instant": false, + "legendFormat": "Response Size", + "range": true, + "refId": "A" + } + ], + "title": "Response Size p95", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 269 + }, + "id": 91, + "panels": [], + "title": "Application", + "type": "row" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Time spent on garbage collection", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 270 + }, + "id": 92, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "rate(go_gc_duration_seconds_sum{instance=~\"$instance\",app=~\"$app\"}[$__interval])", + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "GC Duration", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Counts of garbage collection operations per second", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "cps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 270 + }, + "id": 93, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "rate(go_gc_duration_seconds_count{instance=~\"$instance\",app=~\"$app\"}[$__interval])", + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "GC Per Second", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Garbage collector duration quantiles", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 278 + }, + "id": 94, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum by (quantile) (rate(go_gc_duration_seconds{app=~\"$app\", instance=~\"$instance\"}[$__interval]))", + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "GC Quantiles", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Memory in use by the application over time", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 286 + }, + "id": 96, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "rate(go_memstats_alloc_bytes{app=~\"$app\", instance=~\"$instance\"}[$__interval])", + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Used Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Total number of bytes allocated, even if freed.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 286 + }, + "id": 95, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "rate(go_memstats_alloc_bytes_total{app=~\"$app\", instance=~\"$instance\"}[$__interval])", + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Allocated Memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Total number of frees.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 294 + }, + "id": 97, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "rate(go_memstats_frees_total{app=~\"$app\", instance=~\"$instance\"}[$__interval])", + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Frees", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Number of allocated objects.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "none" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 294 + }, + "id": 104, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "rate(go_memstats_heap_objects{app=~\"$app\", instance=~\"$instance\"}[$__interval])", + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Allocated objects", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Number of heap bytes released to OS.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 302 + }, + "id": 105, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "rate(go_memstats_heap_released_bytes{app=~\"$app\", instance=~\"$instance\"}[$__interval])", + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Released memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Idle vs In Use heap memory", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "normal" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 310 + }, + "id": 106, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(rate(go_memstats_heap_inuse_bytes{app=~\"$app\", instance=~\"$instance\"}[$__interval]))", + "hide": false, + "instant": false, + "legendFormat": "in use", + "range": true, + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(rate(go_memstats_heap_idle_bytes{app=~\"$app\", instance=~\"$instance\"}[$__interval]))", + "instant": false, + "legendFormat": "idle", + "range": true, + "refId": "A" + } + ], + "title": "Heap memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Obtained vs in use stack memory.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + }, + "unit": "bytes" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 318 + }, + "id": 107, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(rate(go_memstats_stack_inuse_bytes{app=~\"$app\", instance=~\"$instance\"}[$__interval]))", + "instant": false, + "legendFormat": "in use", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "sum(rate(go_memstats_stack_sys_bytes{app=~\"$app\", instance=~\"$instance\"}[$__interval]))", + "hide": false, + "instant": false, + "legendFormat": "obtained", + "range": true, + "refId": "B" + } + ], + "title": "Stack memory", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Number of OS threads created.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 326 + }, + "id": 108, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "avg_over_time(go_threads{app=~\"$app\", instance=~\"$instance\"}[$interval])", + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "OS Threads", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "description": "Number of live go routines.", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisBorderShow": false, + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 326 + }, + "id": 109, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "editorMode": "code", + "expr": "avg_over_time(go_goroutines{app=~\"$app\", instance=~\"$instance\"}[$interval])", + "instant": false, + "legendFormat": "{{instance}}", + "range": true, + "refId": "A" + } + ], + "title": "Goroutines", + "type": "timeseries" + } + ], + "refresh": "30s", + "schemaVersion": 39, + "tags": [], + "templating": { + "list": [ + { + "allValue": ".*", + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "definition": "label_values(app)", + "description": "Filter by reporting application", + "hide": 0, + "includeAll": true, + "label": "Application", + "multi": true, + "name": "app", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(app)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "allValue": ".*", + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "definition": "label_values(instance)", + "description": "The Instance that we want to monitor", + "hide": 0, + "includeAll": true, + "label": "Instance", + "multi": true, + "name": "instance", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(instance)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 1, + "type": "query" + }, + { + "allValue": ".*", + "current": { + "selected": false, + "text": "All", + "value": "$__all" + }, + "datasource": { + "type": "prometheus", + "uid": "krakend_prometheus_datasource" + }, + "definition": "label_values(krakend_proxy_duration_bucket,http_route)", + "description": "KrakenD exposed endpoint", + "hide": 0, + "includeAll": true, + "label": "Endpoint", + "multi": true, + "name": "endpoint", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(krakend_proxy_duration_bucket,http_route)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "skipUrlSync": false, + "sort": 0, + "type": "query" + }, + { + "current": { + "selected": false, + "text": "5m", + "value": "5m" + }, + "description": "The granularity of the time interval", + "hide": 0, + "includeAll": false, + "label": "Interval", + "multi": false, + "name": "interval", + "options": [ + { + "selected": false, + "text": "1m", + "value": "1m" + }, + { + "selected": true, + "text": "5m", + "value": "5m" + }, + { + "selected": false, + "text": "15m", + "value": "15m" + }, + { + "selected": false, + "text": "30m", + "value": "30m" + }, + { + "selected": false, + "text": "1h", + "value": "1h" + }, + { + "selected": false, + "text": "2h", + "value": "2h" + }, + { + "selected": false, + "text": "1d", + "value": "1d" + } + ], + "query": "1m,5m,15m,30m,1h,2h,1d", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": false, + "text": "15", + "value": "15" + }, + "description": "Number of elements to display in lists, like top N, or bottom N", + "hide": 0, + "includeAll": false, + "label": "Max items", + "multi": false, + "name": "max_list", + "options": [ + { + "selected": false, + "text": "3", + "value": "3" + }, + { + "selected": false, + "text": "5", + "value": "5" + }, + { + "selected": false, + "text": "10", + "value": "10" + }, + { + "selected": true, + "text": "15", + "value": "15" + }, + { + "selected": false, + "text": "20", + "value": "20" + } + ], + "query": "3,5,10,15,20", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-1h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "KrakenD - OpenTelemetry + Prometheus", + "uid": "d7e631a4-afbc-4267-91e8-b9492bcd801b", + "version": 1, + "weekStart": "" +} \ No newline at end of file diff --git a/messaging/config/telemetry-dashboards/kibana/dashboard.ndjson b/messaging/config/telemetry-dashboards/kibana/dashboard.ndjson new file mode 100644 index 0000000..f561882 --- /dev/null +++ b/messaging/config/telemetry-dashboards/kibana/dashboard.ndjson @@ -0,0 +1,4 @@ +{"attributes":{"allowNoIndex":true,"fieldAttrs":"{}","fields":"[]","name":".alerts-security.alerts-default,apm-*-transaction*,auditbeat-*,endgame-*,filebeat-*,logs-*,packetbeat-*,traces-apm*,winlogbeat-*,-*elastic-cloud-logs-*","runtimeFieldMap":"{}","sourceFilters":"[]","timeFieldName":"@timestamp","title":".alerts-security.alerts-default,apm-*-transaction*,auditbeat-*,endgame-*,filebeat-*,logs-*,packetbeat-*,traces-apm*,winlogbeat-*,-*elastic-cloud-logs-*","typeMeta":"{}"},"coreMigrationVersion":"8.4.1","id":"security-solution-default","migrationVersion":{"index-pattern":"8.0.0"},"references":[],"type":"index-pattern","updated_at":"2022-09-13T08:12:52.146Z","version":"WzI5LDFd"} +{"attributes":{"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"optionsJSON":"{\"useMargins\":true,\"syncColors\":false,\"syncTooltips\":false,\"hidePanelTitles\":false}","panelsJSON":"[{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":0,\"w\":21,\"h\":13,\"i\":\"61c51800-6120-40bb-9e79-0c2cb3a865ad\"},\"panelIndex\":\"61c51800-6120-40bb-9e79-0c2cb3a865ad\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"type\":\"index-pattern\",\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-62c0589c-3e4c-40b4-82cb-d9cd9aad3c45\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"right\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"bar_stacked\",\"layers\":[{\"layerId\":\"62c0589c-3e4c-40b4-82cb-d9cd9aad3c45\",\"accessors\":[\"92025141-7aec-4950-96d5-a56b72dab244\"],\"position\":\"top\",\"seriesType\":\"bar_stacked\",\"showGridlines\":false,\"layerType\":\"data\",\"splitAccessor\":\"ada320d9-0ce1-4277-8926-89d31ad1a1d9\",\"xAccessor\":\"46e5208d-c668-4434-badb-ce3c92969db6\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"62c0589c-3e4c-40b4-82cb-d9cd9aad3c45\":{\"columns\":{\"46e5208d-c668-4434-badb-ce3c92969db6\":{\"label\":\"Top 10 messages\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"msg\",\"isBucketed\":true,\"params\":{\"size\":10,\"orderBy\":{\"type\":\"column\",\"columnId\":\"92025141-7aec-4950-96d5-a56b72dab244\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}},\"customLabel\":true},\"92025141-7aec-4950-96d5-a56b72dab244\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}},\"ada320d9-0ce1-4277-8926-89d31ad1a1d9\":{\"label\":\"SCOPE\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"scope\",\"isBucketed\":true,\"params\":{\"size\":10,\"orderBy\":{\"type\":\"column\",\"columnId\":\"92025141-7aec-4950-96d5-a56b72dab244\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}},\"customLabel\":true}},\"columnOrder\":[\"46e5208d-c668-4434-badb-ce3c92969db6\",\"ada320d9-0ce1-4277-8926-89d31ad1a1d9\",\"92025141-7aec-4950-96d5-a56b72dab244\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Top 10 messages\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":21,\"y\":0,\"w\":21,\"h\":13,\"i\":\"14d142f6-9a47-47fe-912a-5a48d4212bcc\"},\"panelIndex\":\"14d142f6-9a47-47fe-912a-5a48d4212bcc\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"type\":\"index-pattern\",\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-7d16ac75-e86f-47ff-a746-2bf0b9ea6a0f\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"right\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"bar_stacked\",\"layers\":[{\"layerId\":\"7d16ac75-e86f-47ff-a746-2bf0b9ea6a0f\",\"seriesType\":\"bar_stacked\",\"accessors\":[\"d16b154c-351e-42d6-8718-60088e778242\"],\"layerType\":\"data\",\"splitAccessor\":\"01e38aaa-3961-463c-b5d0-7b84ab645125\",\"xAccessor\":\"3fdc7688-5b9e-4ba3-9bc8-c7e8aa392613\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"7d16ac75-e86f-47ff-a746-2bf0b9ea6a0f\":{\"columns\":{\"3fdc7688-5b9e-4ba3-9bc8-c7e8aa392613\":{\"label\":\"Filters\",\"dataType\":\"string\",\"operationType\":\"filters\",\"scale\":\"ordinal\",\"isBucketed\":true,\"params\":{\"filters\":[{\"label\":\"\",\"input\":{\"query\":\"scope : SERVICE\",\"language\":\"kuery\"}}]}},\"d16b154c-351e-42d6-8718-60088e778242\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}},\"01e38aaa-3961-463c-b5d0-7b84ab645125\":{\"label\":\"Top 20 values of context\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"context\",\"isBucketed\":true,\"params\":{\"size\":20,\"orderBy\":{\"type\":\"column\",\"columnId\":\"d16b154c-351e-42d6-8718-60088e778242\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}}},\"columnOrder\":[\"3fdc7688-5b9e-4ba3-9bc8-c7e8aa392613\",\"01e38aaa-3961-463c-b5d0-7b84ab645125\",\"d16b154c-351e-42d6-8718-60088e778242\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Top SERVICE messages\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":42,\"y\":0,\"w\":6,\"h\":6,\"i\":\"a5aaa0eb-0580-4970-a92f-f057b57c17aa\"},\"panelIndex\":\"a5aaa0eb-0580-4970-a92f-f057b57c17aa\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsPie\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-5c308554-7dc3-4986-b31e-232c976657a2\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"shape\":\"donut\",\"layers\":[{\"layerId\":\"5c308554-7dc3-4986-b31e-232c976657a2\",\"groups\":[\"aa02addb-82df-4a3c-a052-b6564797c7ad\"],\"metric\":\"1327f462-8a28-4421-9b42-7a25f2cbf07e\",\"numberDisplay\":\"percent\",\"categoryDisplay\":\"default\",\"legendDisplay\":\"default\",\"nestedLegend\":false,\"layerType\":\"data\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"5c308554-7dc3-4986-b31e-232c976657a2\":{\"columns\":{\"aa02addb-82df-4a3c-a052-b6564797c7ad\":{\"label\":\"Top 10 values of statusCode\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"statusCode\",\"isBucketed\":true,\"params\":{\"size\":10,\"orderBy\":{\"type\":\"column\",\"columnId\":\"1327f462-8a28-4421-9b42-7a25f2cbf07e\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"1327f462-8a28-4421-9b42-7a25f2cbf07e\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}}},\"columnOrder\":[\"aa02addb-82df-4a3c-a052-b6564797c7ad\",\"1327f462-8a28-4421-9b42-7a25f2cbf07e\"],\"incompleteColumns\":{}}}}}}},\"enhancements\":{},\"hidePanelTitles\":false},\"title\":\"% of Status Codes\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":42,\"y\":6,\"w\":6,\"h\":7,\"i\":\"7bbec2fb-0ab6-4f6a-8259-cc46f91d5a9b\"},\"panelIndex\":\"7bbec2fb-0ab6-4f6a-8259-cc46f91d5a9b\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsPie\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-73d168b7-3b62-4c83-9f8f-d59ccb1ceea6\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"shape\":\"donut\",\"layers\":[{\"layerId\":\"73d168b7-3b62-4c83-9f8f-d59ccb1ceea6\",\"groups\":[\"d74c9301-1bce-472c-bcf5-3d4f3d69e6ab\"],\"metric\":\"72b1102a-e79c-4240-b82e-d96f2b5312d5\",\"numberDisplay\":\"percent\",\"categoryDisplay\":\"default\",\"legendDisplay\":\"default\",\"nestedLegend\":false,\"layerType\":\"data\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"73d168b7-3b62-4c83-9f8f-d59ccb1ceea6\":{\"columns\":{\"d74c9301-1bce-472c-bcf5-3d4f3d69e6ab\":{\"label\":\"Top 5 values of ip\",\"dataType\":\"ip\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"ip\",\"isBucketed\":true,\"params\":{\"size\":5,\"orderBy\":{\"type\":\"column\",\"columnId\":\"72b1102a-e79c-4240-b82e-d96f2b5312d5\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"72b1102a-e79c-4240-b82e-d96f2b5312d5\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}}},\"columnOrder\":[\"d74c9301-1bce-472c-bcf5-3d4f3d69e6ab\",\"72b1102a-e79c-4240-b82e-d96f2b5312d5\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Top 5 IPs\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":13,\"w\":21,\"h\":10,\"i\":\"87bdb6b4-2c78-4491-b812-8a05061da493\"},\"panelIndex\":\"87bdb6b4-2c78-4491-b812-8a05061da493\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"type\":\"index-pattern\",\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-310c919e-6479-4a10-b8b9-f0c8feb69262\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"right\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"bar_stacked\",\"layers\":[{\"layerId\":\"310c919e-6479-4a10-b8b9-f0c8feb69262\",\"accessors\":[\"dd7f7b4a-c732-41f8-ab18-520a7b5f7b1a\"],\"position\":\"top\",\"seriesType\":\"bar_stacked\",\"showGridlines\":false,\"layerType\":\"data\",\"xAccessor\":\"a2df1297-1f82-4bc1-a9e5-3657716c8bfe\",\"splitAccessor\":\"c539ed4f-b906-42a1-9036-a401b29ba1c5\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"310c919e-6479-4a10-b8b9-f0c8feb69262\":{\"columns\":{\"a2df1297-1f82-4bc1-a9e5-3657716c8bfe\":{\"label\":\"Filters\",\"dataType\":\"string\",\"operationType\":\"filters\",\"scale\":\"ordinal\",\"isBucketed\":true,\"params\":{\"filters\":[{\"label\":\"\",\"input\":{\"query\":\"scope : ENDPOINT\",\"language\":\"kuery\"}}]}},\"dd7f7b4a-c732-41f8-ab18-520a7b5f7b1a\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}},\"c539ed4f-b906-42a1-9036-a401b29ba1c5\":{\"label\":\"Top 15 values of msg\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"msg\",\"isBucketed\":true,\"params\":{\"size\":15,\"orderBy\":{\"type\":\"column\",\"columnId\":\"dd7f7b4a-c732-41f8-ab18-520a7b5f7b1a\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}}},\"columnOrder\":[\"a2df1297-1f82-4bc1-a9e5-3657716c8bfe\",\"c539ed4f-b906-42a1-9036-a401b29ba1c5\",\"dd7f7b4a-c732-41f8-ab18-520a7b5f7b1a\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Top Endpoint messages\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":21,\"y\":13,\"w\":21,\"h\":10,\"i\":\"3adf3d59-f407-49f8-866d-01868cd2b422\"},\"panelIndex\":\"3adf3d59-f407-49f8-866d-01868cd2b422\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsDatatable\",\"type\":\"lens\",\"references\":[{\"type\":\"index-pattern\",\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-6bb18b1d-e479-4493-84d0-3e03ae5680af\"}],\"state\":{\"visualization\":{\"layerId\":\"6bb18b1d-e479-4493-84d0-3e03ae5680af\",\"layerType\":\"data\",\"columns\":[{\"isTransposed\":false,\"columnId\":\"afd3e931-1327-4fba-9578-2ec874d60746\",\"width\":169.5},{\"isTransposed\":false,\"columnId\":\"6de0fe8f-c00e-4131-b503-56ab6748c258\",\"width\":316.3333333333333},{\"isTransposed\":false,\"columnId\":\"0f3195ad-4a49-4c86-bd53-f959e375fb47\",\"width\":201.83333333333334},{\"columnId\":\"866cd177-31d6-467a-a54e-1dbe2cddc4d9\",\"isTransposed\":false}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"6bb18b1d-e479-4493-84d0-3e03ae5680af\":{\"columns\":{\"afd3e931-1327-4fba-9578-2ec874d60746\":{\"label\":\"Top 5 values of scope\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"scope\",\"isBucketed\":true,\"params\":{\"size\":5,\"orderBy\":{\"type\":\"column\",\"columnId\":\"866cd177-31d6-467a-a54e-1dbe2cddc4d9\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"6de0fe8f-c00e-4131-b503-56ab6748c258\":{\"label\":\"Top 100 values of msg\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"msg\",\"isBucketed\":true,\"params\":{\"size\":100,\"orderBy\":{\"type\":\"column\",\"columnId\":\"866cd177-31d6-467a-a54e-1dbe2cddc4d9\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"0f3195ad-4a49-4c86-bd53-f959e375fb47\":{\"label\":\"Top 10 values of context\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"context\",\"isBucketed\":true,\"params\":{\"size\":10,\"orderBy\":{\"type\":\"column\",\"columnId\":\"866cd177-31d6-467a-a54e-1dbe2cddc4d9\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"866cd177-31d6-467a-a54e-1dbe2cddc4d9\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}}},\"columnOrder\":[\"afd3e931-1327-4fba-9578-2ec874d60746\",\"0f3195ad-4a49-4c86-bd53-f959e375fb47\",\"6de0fe8f-c00e-4131-b503-56ab6748c258\",\"866cd177-31d6-467a-a54e-1dbe2cddc4d9\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Top 100 log messages\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":42,\"y\":13,\"w\":5,\"h\":10,\"i\":\"f69f88a6-ecca-4d78-955b-73c919f93368\"},\"panelIndex\":\"f69f88a6-ecca-4d78-955b-73c919f93368\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-23379a89-f323-4aed-9a31-697065d9d765\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"layerId\":\"23379a89-f323-4aed-9a31-697065d9d765\",\"accessor\":\"4a7fa1f5-f9b9-4a4d-bf04-156305695c13\",\"layerType\":\"data\",\"colorMode\":\"None\"},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"23379a89-f323-4aed-9a31-697065d9d765\":{\"columns\":{\"4a7fa1f5-f9b9-4a4d-bf04-156305695c13\":{\"label\":\"Average response time\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"duration\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true},\"customLabel\":true}},\"columnOrder\":[\"4a7fa1f5-f9b9-4a4d-bf04-156305695c13\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Current response time\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":23,\"w\":24,\"h\":10,\"i\":\"fd9092c9-08bd-4e55-b7ac-489f201212e6\"},\"panelIndex\":\"fd9092c9-08bd-4e55-b7ac-489f201212e6\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-c7d7d3a0-dcbd-4ddb-b949-50b2c2ebb9f7\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"right\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"area\",\"layers\":[{\"layerId\":\"c7d7d3a0-dcbd-4ddb-b949-50b2c2ebb9f7\",\"seriesType\":\"area\",\"xAccessor\":\"2310c8c9-6cfb-467b-9774-f30727e17502\",\"splitAccessor\":\"fca1c672-0435-40cb-9470-d2436aa29e2b\",\"accessors\":[\"8f66020e-98a4-40a1-8c3f-98aac6aa3b3a\"],\"layerType\":\"data\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"c7d7d3a0-dcbd-4ddb-b949-50b2c2ebb9f7\":{\"columns\":{\"fca1c672-0435-40cb-9470-d2436aa29e2b\":{\"label\":\"Top 3 values of url\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"url\",\"isBucketed\":true,\"params\":{\"size\":3,\"orderBy\":{\"type\":\"column\",\"columnId\":\"8f66020e-98a4-40a1-8c3f-98aac6aa3b3a\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"2310c8c9-6cfb-467b-9774-f30727e17502\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"8f66020e-98a4-40a1-8c3f-98aac6aa3b3a\":{\"label\":\"Average of duration\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"duration\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true}}},\"columnOrder\":[\"fca1c672-0435-40cb-9470-d2436aa29e2b\",\"2310c8c9-6cfb-467b-9774-f30727e17502\",\"8f66020e-98a4-40a1-8c3f-98aac6aa3b3a\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Response time (average)\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":24,\"y\":23,\"w\":22,\"h\":22,\"i\":\"ce03539a-a246-442b-b6ff-6f0ba127100a\"},\"panelIndex\":\"ce03539a-a246-442b-b6ff-6f0ba127100a\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsDatatable\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-312ab185-e6dc-4954-b768-b4a32c4b98ba\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"layerId\":\"312ab185-e6dc-4954-b768-b4a32c4b98ba\",\"layerType\":\"data\",\"columns\":[{\"isTransposed\":false,\"columnId\":\"af6e980a-feb3-441f-bf4d-a220d5868339\"},{\"isTransposed\":false,\"columnId\":\"9f597c76-47cd-4080-9bbd-9e3d94f6c5ae\"},{\"isTransposed\":false,\"columnId\":\"20e57cae-8a85-4c97-bf10-1d009b294264\",\"hidden\":false},{\"columnId\":\"05804846-0833-4aa1-acf5-5a3d7df9573b\",\"isTransposed\":false}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"312ab185-e6dc-4954-b768-b4a32c4b98ba\":{\"columns\":{\"af6e980a-feb3-441f-bf4d-a220d5868339\":{\"label\":\"Top 50 values of url\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"url\",\"isBucketed\":true,\"params\":{\"size\":50,\"orderBy\":{\"type\":\"column\",\"columnId\":\"9f597c76-47cd-4080-9bbd-9e3d94f6c5ae\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"9f597c76-47cd-4080-9bbd-9e3d94f6c5ae\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}},\"20e57cae-8a85-4c97-bf10-1d009b294264\":{\"label\":\"Percentile of 200 codes\",\"dataType\":\"number\",\"operationType\":\"percentile_rank\",\"sourceField\":\"statusCode\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"value\":200},\"customLabel\":true},\"05804846-0833-4aa1-acf5-5a3d7df9573b\":{\"label\":\"Average of duration\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"duration\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true}}},\"columnOrder\":[\"af6e980a-feb3-441f-bf4d-a220d5868339\",\"9f597c76-47cd-4080-9bbd-9e3d94f6c5ae\",\"20e57cae-8a85-4c97-bf10-1d009b294264\",\"05804846-0833-4aa1-acf5-5a3d7df9573b\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"API hits by endpoint\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":33,\"w\":24,\"h\":12,\"i\":\"6f0757c3-f695-41b3-a455-bcf86da79406\"},\"panelIndex\":\"6f0757c3-f695-41b3-a455-bcf86da79406\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-248cdf95-161c-4de1-84a1-170fcbae975d\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"right\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"bar_stacked\",\"layers\":[{\"layerId\":\"248cdf95-161c-4de1-84a1-170fcbae975d\",\"accessors\":[\"aa2e565f-9c9b-4448-a818-94dcc24a7e47\"],\"position\":\"top\",\"seriesType\":\"bar_stacked\",\"showGridlines\":false,\"layerType\":\"data\",\"xAccessor\":\"7ec17b55-e226-4971-bfd9-72b4505d7b8f\",\"splitAccessor\":\"be435127-fcaf-4a6d-a2dc-b175ff4a236c\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"248cdf95-161c-4de1-84a1-170fcbae975d\":{\"columns\":{\"7ec17b55-e226-4971-bfd9-72b4505d7b8f\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"aa2e565f-9c9b-4448-a818-94dcc24a7e47\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}},\"be435127-fcaf-4a6d-a2dc-b175ff4a236c\":{\"label\":\"Top 10 values of url\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"url\",\"isBucketed\":true,\"params\":{\"size\":10,\"orderBy\":{\"type\":\"column\",\"columnId\":\"aa2e565f-9c9b-4448-a818-94dcc24a7e47\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}}},\"columnOrder\":[\"be435127-fcaf-4a6d-a2dc-b175ff4a236c\",\"7ec17b55-e226-4971-bfd9-72b4505d7b8f\",\"aa2e565f-9c9b-4448-a818-94dcc24a7e47\"],\"incompleteColumns\":{}}}}}}},\"enhancements\":{},\"hidePanelTitles\":false},\"title\":\"Top 10 requests over time\"}]","timeRestore":false,"title":"KrakenD Application Log","version":1},"coreMigrationVersion":"8.4.1","id":"7b3ca1f0-3343-11ed-b2ac-1b9e6ebd5701","migrationVersion":{"dashboard":"8.4.0"},"references":[{"id":"security-solution-default","name":"61c51800-6120-40bb-9e79-0c2cb3a865ad:indexpattern-datasource-layer-62c0589c-3e4c-40b4-82cb-d9cd9aad3c45","type":"index-pattern"},{"id":"security-solution-default","name":"14d142f6-9a47-47fe-912a-5a48d4212bcc:indexpattern-datasource-layer-7d16ac75-e86f-47ff-a746-2bf0b9ea6a0f","type":"index-pattern"},{"id":"security-solution-default","name":"a5aaa0eb-0580-4970-a92f-f057b57c17aa:indexpattern-datasource-layer-5c308554-7dc3-4986-b31e-232c976657a2","type":"index-pattern"},{"id":"security-solution-default","name":"7bbec2fb-0ab6-4f6a-8259-cc46f91d5a9b:indexpattern-datasource-layer-73d168b7-3b62-4c83-9f8f-d59ccb1ceea6","type":"index-pattern"},{"id":"security-solution-default","name":"87bdb6b4-2c78-4491-b812-8a05061da493:indexpattern-datasource-layer-310c919e-6479-4a10-b8b9-f0c8feb69262","type":"index-pattern"},{"id":"security-solution-default","name":"3adf3d59-f407-49f8-866d-01868cd2b422:indexpattern-datasource-layer-6bb18b1d-e479-4493-84d0-3e03ae5680af","type":"index-pattern"},{"id":"security-solution-default","name":"f69f88a6-ecca-4d78-955b-73c919f93368:indexpattern-datasource-layer-23379a89-f323-4aed-9a31-697065d9d765","type":"index-pattern"},{"id":"security-solution-default","name":"fd9092c9-08bd-4e55-b7ac-489f201212e6:indexpattern-datasource-layer-c7d7d3a0-dcbd-4ddb-b949-50b2c2ebb9f7","type":"index-pattern"},{"id":"security-solution-default","name":"ce03539a-a246-442b-b6ff-6f0ba127100a:indexpattern-datasource-layer-312ab185-e6dc-4954-b768-b4a32c4b98ba","type":"index-pattern"},{"id":"security-solution-default","name":"6f0757c3-f695-41b3-a455-bcf86da79406:indexpattern-datasource-layer-248cdf95-161c-4de1-84a1-170fcbae975d","type":"index-pattern"}],"type":"dashboard","updated_at":"2022-09-13T09:07:24.175Z","version":"WzEyOTMsMV0="} +{"attributes":{"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filter\":[]}"},"optionsJSON":"{\"useMargins\":true,\"syncColors\":false,\"syncTooltips\":false,\"hidePanelTitles\":false}","panelsJSON":"[{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":0,\"w\":21,\"h\":13,\"i\":\"61c51800-6120-40bb-9e79-0c2cb3a865ad\"},\"panelIndex\":\"61c51800-6120-40bb-9e79-0c2cb3a865ad\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-62c0589c-3e4c-40b4-82cb-d9cd9aad3c45\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"right\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"line\",\"layers\":[{\"layerId\":\"62c0589c-3e4c-40b4-82cb-d9cd9aad3c45\",\"accessors\":[\"44dbb541-6d8b-4c4d-841c-040d2abbcaeb\"],\"position\":\"top\",\"seriesType\":\"line\",\"showGridlines\":false,\"layerType\":\"data\",\"xAccessor\":\"b195d83d-4051-48b3-82b5-31e22d06655e\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"62c0589c-3e4c-40b4-82cb-d9cd9aad3c45\":{\"columns\":{\"b195d83d-4051-48b3-82b5-31e22d06655e\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"44dbb541-6d8b-4c4d-841c-040d2abbcaeb\":{\"label\":\"Hits\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true},\"customLabel\":true}},\"columnOrder\":[\"b195d83d-4051-48b3-82b5-31e22d06655e\",\"44dbb541-6d8b-4c4d-841c-040d2abbcaeb\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"API hits\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":21,\"y\":0,\"w\":21,\"h\":13,\"i\":\"14d142f6-9a47-47fe-912a-5a48d4212bcc\"},\"panelIndex\":\"14d142f6-9a47-47fe-912a-5a48d4212bcc\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-7d16ac75-e86f-47ff-a746-2bf0b9ea6a0f\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"right\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"bar_stacked\",\"layers\":[{\"layerId\":\"7d16ac75-e86f-47ff-a746-2bf0b9ea6a0f\",\"seriesType\":\"bar_stacked\",\"xAccessor\":\"1febc61b-de7d-4b9f-bc3e-a0f6b360b967\",\"splitAccessor\":\"eb953731-b64b-4699-9168-1bcfb7e800c3\",\"accessors\":[\"f7ae01a4-60b9-4492-b8fd-dbc3a2a13d27\"],\"layerType\":\"data\",\"palette\":{\"type\":\"palette\",\"name\":\"kibana_palette\"}}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"7d16ac75-e86f-47ff-a746-2bf0b9ea6a0f\":{\"columns\":{\"1febc61b-de7d-4b9f-bc3e-a0f6b360b967\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"f7ae01a4-60b9-4492-b8fd-dbc3a2a13d27\":{\"label\":\"Count of statusCode\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"statusCode\",\"params\":{\"emptyAsNull\":true}},\"eb953731-b64b-4699-9168-1bcfb7e800c3\":{\"label\":\"Top status codes\",\"dataType\":\"number\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"statusCode\",\"isBucketed\":true,\"params\":{\"size\":10,\"orderBy\":{\"type\":\"column\",\"columnId\":\"f7ae01a4-60b9-4492-b8fd-dbc3a2a13d27\"},\"orderDirection\":\"asc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}},\"customLabel\":true}},\"columnOrder\":[\"1febc61b-de7d-4b9f-bc3e-a0f6b360b967\",\"eb953731-b64b-4699-9168-1bcfb7e800c3\",\"f7ae01a4-60b9-4492-b8fd-dbc3a2a13d27\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Status code distribution over time\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":42,\"y\":0,\"w\":6,\"h\":6,\"i\":\"a5aaa0eb-0580-4970-a92f-f057b57c17aa\"},\"panelIndex\":\"a5aaa0eb-0580-4970-a92f-f057b57c17aa\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsPie\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-5c308554-7dc3-4986-b31e-232c976657a2\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"shape\":\"donut\",\"layers\":[{\"layerId\":\"5c308554-7dc3-4986-b31e-232c976657a2\",\"groups\":[\"aa02addb-82df-4a3c-a052-b6564797c7ad\"],\"metric\":\"1327f462-8a28-4421-9b42-7a25f2cbf07e\",\"numberDisplay\":\"percent\",\"categoryDisplay\":\"default\",\"legendDisplay\":\"default\",\"nestedLegend\":false,\"layerType\":\"data\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"5c308554-7dc3-4986-b31e-232c976657a2\":{\"columns\":{\"aa02addb-82df-4a3c-a052-b6564797c7ad\":{\"label\":\"Top 10 values of statusCode\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"statusCode\",\"isBucketed\":true,\"params\":{\"size\":10,\"orderBy\":{\"type\":\"column\",\"columnId\":\"1327f462-8a28-4421-9b42-7a25f2cbf07e\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"1327f462-8a28-4421-9b42-7a25f2cbf07e\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}}},\"columnOrder\":[\"aa02addb-82df-4a3c-a052-b6564797c7ad\",\"1327f462-8a28-4421-9b42-7a25f2cbf07e\"],\"incompleteColumns\":{}}}}}}},\"enhancements\":{},\"hidePanelTitles\":false},\"title\":\"% of Status Codes\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":42,\"y\":6,\"w\":6,\"h\":7,\"i\":\"7bbec2fb-0ab6-4f6a-8259-cc46f91d5a9b\"},\"panelIndex\":\"7bbec2fb-0ab6-4f6a-8259-cc46f91d5a9b\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsPie\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-73d168b7-3b62-4c83-9f8f-d59ccb1ceea6\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"shape\":\"donut\",\"layers\":[{\"layerId\":\"73d168b7-3b62-4c83-9f8f-d59ccb1ceea6\",\"groups\":[\"d74c9301-1bce-472c-bcf5-3d4f3d69e6ab\"],\"metric\":\"72b1102a-e79c-4240-b82e-d96f2b5312d5\",\"numberDisplay\":\"percent\",\"categoryDisplay\":\"default\",\"legendDisplay\":\"default\",\"nestedLegend\":false,\"layerType\":\"data\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"73d168b7-3b62-4c83-9f8f-d59ccb1ceea6\":{\"columns\":{\"d74c9301-1bce-472c-bcf5-3d4f3d69e6ab\":{\"label\":\"Top 5 values of ip\",\"dataType\":\"ip\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"ip\",\"isBucketed\":true,\"params\":{\"size\":5,\"orderBy\":{\"type\":\"column\",\"columnId\":\"72b1102a-e79c-4240-b82e-d96f2b5312d5\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"72b1102a-e79c-4240-b82e-d96f2b5312d5\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}}},\"columnOrder\":[\"d74c9301-1bce-472c-bcf5-3d4f3d69e6ab\",\"72b1102a-e79c-4240-b82e-d96f2b5312d5\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Top 5 IPs\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":13,\"w\":21,\"h\":9,\"i\":\"87bdb6b4-2c78-4491-b812-8a05061da493\"},\"panelIndex\":\"87bdb6b4-2c78-4491-b812-8a05061da493\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-310c919e-6479-4a10-b8b9-f0c8feb69262\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"right\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"line\",\"layers\":[{\"layerId\":\"310c919e-6479-4a10-b8b9-f0c8feb69262\",\"accessors\":[\"96958bf4-e4ac-4a00-92a0-48b8ea3eece9\"],\"position\":\"top\",\"seriesType\":\"line\",\"showGridlines\":false,\"layerType\":\"data\",\"xAccessor\":\"90f99851-cd6e-44eb-9fde-8ab5ef8bc9a9\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"310c919e-6479-4a10-b8b9-f0c8feb69262\":{\"columns\":{\"90f99851-cd6e-44eb-9fde-8ab5ef8bc9a9\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"96958bf4-e4ac-4a00-92a0-48b8ea3eece9\":{\"label\":\"Average of duration\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"duration\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true}}},\"columnOrder\":[\"90f99851-cd6e-44eb-9fde-8ab5ef8bc9a9\",\"96958bf4-e4ac-4a00-92a0-48b8ea3eece9\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Response time\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":21,\"y\":13,\"w\":21,\"h\":9,\"i\":\"3adf3d59-f407-49f8-866d-01868cd2b422\"},\"panelIndex\":\"3adf3d59-f407-49f8-866d-01868cd2b422\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsDatatable\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-6bb18b1d-e479-4493-84d0-3e03ae5680af\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"layerId\":\"6bb18b1d-e479-4493-84d0-3e03ae5680af\",\"layerType\":\"data\",\"columns\":[{\"columnId\":\"854a31ce-d958-4835-a5cc-7db421c7f84b\"},{\"columnId\":\"e419d9c5-416c-4efa-aec9-2497fe86c7b9\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"6bb18b1d-e479-4493-84d0-3e03ae5680af\":{\"columns\":{\"854a31ce-d958-4835-a5cc-7db421c7f84b\":{\"label\":\"Top 10 values of url\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"url\",\"isBucketed\":true,\"params\":{\"size\":10,\"orderBy\":{\"type\":\"column\",\"columnId\":\"e419d9c5-416c-4efa-aec9-2497fe86c7b9\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"e419d9c5-416c-4efa-aec9-2497fe86c7b9\":{\"label\":\"Maximum of duration\",\"dataType\":\"number\",\"operationType\":\"max\",\"sourceField\":\"duration\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true}}},\"columnOrder\":[\"854a31ce-d958-4835-a5cc-7db421c7f84b\",\"e419d9c5-416c-4efa-aec9-2497fe86c7b9\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Worst response times\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":42,\"y\":13,\"w\":6,\"h\":9,\"i\":\"f69f88a6-ecca-4d78-955b-73c919f93368\"},\"panelIndex\":\"f69f88a6-ecca-4d78-955b-73c919f93368\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsMetric\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-23379a89-f323-4aed-9a31-697065d9d765\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"layerId\":\"23379a89-f323-4aed-9a31-697065d9d765\",\"accessor\":\"4a7fa1f5-f9b9-4a4d-bf04-156305695c13\",\"layerType\":\"data\",\"colorMode\":\"None\"},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"23379a89-f323-4aed-9a31-697065d9d765\":{\"columns\":{\"4a7fa1f5-f9b9-4a4d-bf04-156305695c13\":{\"label\":\"Average response time\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"duration\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true},\"customLabel\":true}},\"columnOrder\":[\"4a7fa1f5-f9b9-4a4d-bf04-156305695c13\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Current response time\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":22,\"w\":24,\"h\":14,\"i\":\"fd9092c9-08bd-4e55-b7ac-489f201212e6\"},\"panelIndex\":\"fd9092c9-08bd-4e55-b7ac-489f201212e6\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-c7d7d3a0-dcbd-4ddb-b949-50b2c2ebb9f7\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"right\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"area\",\"layers\":[{\"layerId\":\"c7d7d3a0-dcbd-4ddb-b949-50b2c2ebb9f7\",\"seriesType\":\"area\",\"xAccessor\":\"2310c8c9-6cfb-467b-9774-f30727e17502\",\"splitAccessor\":\"fca1c672-0435-40cb-9470-d2436aa29e2b\",\"accessors\":[\"8f66020e-98a4-40a1-8c3f-98aac6aa3b3a\"],\"layerType\":\"data\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"c7d7d3a0-dcbd-4ddb-b949-50b2c2ebb9f7\":{\"columns\":{\"fca1c672-0435-40cb-9470-d2436aa29e2b\":{\"label\":\"Top 3 values of url\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"url\",\"isBucketed\":true,\"params\":{\"size\":3,\"orderBy\":{\"type\":\"column\",\"columnId\":\"8f66020e-98a4-40a1-8c3f-98aac6aa3b3a\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"2310c8c9-6cfb-467b-9774-f30727e17502\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"8f66020e-98a4-40a1-8c3f-98aac6aa3b3a\":{\"label\":\"Average of duration\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"duration\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true}}},\"columnOrder\":[\"fca1c672-0435-40cb-9470-d2436aa29e2b\",\"2310c8c9-6cfb-467b-9774-f30727e17502\",\"8f66020e-98a4-40a1-8c3f-98aac6aa3b3a\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"Response time (average)\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":24,\"y\":22,\"w\":24,\"h\":32,\"i\":\"ce03539a-a246-442b-b6ff-6f0ba127100a\"},\"panelIndex\":\"ce03539a-a246-442b-b6ff-6f0ba127100a\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsDatatable\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-312ab185-e6dc-4954-b768-b4a32c4b98ba\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"layerId\":\"312ab185-e6dc-4954-b768-b4a32c4b98ba\",\"layerType\":\"data\",\"columns\":[{\"isTransposed\":false,\"columnId\":\"af6e980a-feb3-441f-bf4d-a220d5868339\"},{\"isTransposed\":false,\"columnId\":\"9f597c76-47cd-4080-9bbd-9e3d94f6c5ae\"},{\"isTransposed\":false,\"columnId\":\"20e57cae-8a85-4c97-bf10-1d009b294264\",\"hidden\":false},{\"columnId\":\"05804846-0833-4aa1-acf5-5a3d7df9573b\",\"isTransposed\":false}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"312ab185-e6dc-4954-b768-b4a32c4b98ba\":{\"columns\":{\"af6e980a-feb3-441f-bf4d-a220d5868339\":{\"label\":\"Top 50 values of url\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"url\",\"isBucketed\":true,\"params\":{\"size\":50,\"orderBy\":{\"type\":\"column\",\"columnId\":\"9f597c76-47cd-4080-9bbd-9e3d94f6c5ae\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}},\"9f597c76-47cd-4080-9bbd-9e3d94f6c5ae\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}},\"20e57cae-8a85-4c97-bf10-1d009b294264\":{\"label\":\"Percentile of 200 codes\",\"dataType\":\"number\",\"operationType\":\"percentile_rank\",\"sourceField\":\"statusCode\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"value\":200},\"customLabel\":true},\"05804846-0833-4aa1-acf5-5a3d7df9573b\":{\"label\":\"Average of duration\",\"dataType\":\"number\",\"operationType\":\"average\",\"sourceField\":\"duration\",\"isBucketed\":false,\"scale\":\"ratio\",\"params\":{\"emptyAsNull\":true}}},\"columnOrder\":[\"af6e980a-feb3-441f-bf4d-a220d5868339\",\"9f597c76-47cd-4080-9bbd-9e3d94f6c5ae\",\"20e57cae-8a85-4c97-bf10-1d009b294264\",\"05804846-0833-4aa1-acf5-5a3d7df9573b\"],\"incompleteColumns\":{}}}}}}},\"hidePanelTitles\":false,\"enhancements\":{}},\"title\":\"API hits by endpoint\"},{\"version\":\"8.4.1\",\"type\":\"lens\",\"gridData\":{\"x\":0,\"y\":36,\"w\":24,\"h\":18,\"i\":\"6f0757c3-f695-41b3-a455-bcf86da79406\"},\"panelIndex\":\"6f0757c3-f695-41b3-a455-bcf86da79406\",\"embeddableConfig\":{\"attributes\":{\"title\":\"\",\"visualizationType\":\"lnsXY\",\"type\":\"lens\",\"references\":[{\"id\":\"security-solution-default\",\"name\":\"indexpattern-datasource-layer-248cdf95-161c-4de1-84a1-170fcbae975d\",\"type\":\"index-pattern\"}],\"state\":{\"visualization\":{\"legend\":{\"isVisible\":true,\"position\":\"right\"},\"valueLabels\":\"hide\",\"fittingFunction\":\"None\",\"axisTitlesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"tickLabelsVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"labelsOrientation\":{\"x\":0,\"yLeft\":0,\"yRight\":0},\"gridlinesVisibilitySettings\":{\"x\":true,\"yLeft\":true,\"yRight\":true},\"preferredSeriesType\":\"bar_stacked\",\"layers\":[{\"layerId\":\"248cdf95-161c-4de1-84a1-170fcbae975d\",\"accessors\":[\"aa2e565f-9c9b-4448-a818-94dcc24a7e47\"],\"position\":\"top\",\"seriesType\":\"bar_stacked\",\"showGridlines\":false,\"layerType\":\"data\",\"xAccessor\":\"7ec17b55-e226-4971-bfd9-72b4505d7b8f\",\"splitAccessor\":\"be435127-fcaf-4a6d-a2dc-b175ff4a236c\"}]},\"query\":{\"query\":\"\",\"language\":\"kuery\"},\"filters\":[],\"datasourceStates\":{\"indexpattern\":{\"layers\":{\"248cdf95-161c-4de1-84a1-170fcbae975d\":{\"columns\":{\"7ec17b55-e226-4971-bfd9-72b4505d7b8f\":{\"label\":\"@timestamp\",\"dataType\":\"date\",\"operationType\":\"date_histogram\",\"sourceField\":\"@timestamp\",\"isBucketed\":true,\"scale\":\"interval\",\"params\":{\"interval\":\"auto\",\"includeEmptyRows\":true,\"dropPartials\":false}},\"aa2e565f-9c9b-4448-a818-94dcc24a7e47\":{\"label\":\"Count of records\",\"dataType\":\"number\",\"operationType\":\"count\",\"isBucketed\":false,\"scale\":\"ratio\",\"sourceField\":\"___records___\",\"params\":{\"emptyAsNull\":true}},\"be435127-fcaf-4a6d-a2dc-b175ff4a236c\":{\"label\":\"Top 10 values of url\",\"dataType\":\"string\",\"operationType\":\"terms\",\"scale\":\"ordinal\",\"sourceField\":\"url\",\"isBucketed\":true,\"params\":{\"size\":10,\"orderBy\":{\"type\":\"column\",\"columnId\":\"aa2e565f-9c9b-4448-a818-94dcc24a7e47\"},\"orderDirection\":\"desc\",\"otherBucket\":true,\"missingBucket\":false,\"parentFormat\":{\"id\":\"terms\"}}}},\"columnOrder\":[\"be435127-fcaf-4a6d-a2dc-b175ff4a236c\",\"7ec17b55-e226-4971-bfd9-72b4505d7b8f\",\"aa2e565f-9c9b-4448-a818-94dcc24a7e47\"],\"incompleteColumns\":{}}}}}}},\"enhancements\":{},\"hidePanelTitles\":false},\"title\":\"Top 10 requests over time\"}]","timeRestore":false,"title":"KrakenD Access Log","version":1},"coreMigrationVersion":"8.4.1","id":"0fced160-333c-11ed-b2ac-1b9e6ebd5701","migrationVersion":{"dashboard":"8.4.0"},"references":[{"id":"security-solution-default","name":"61c51800-6120-40bb-9e79-0c2cb3a865ad:indexpattern-datasource-layer-62c0589c-3e4c-40b4-82cb-d9cd9aad3c45","type":"index-pattern"},{"id":"security-solution-default","name":"14d142f6-9a47-47fe-912a-5a48d4212bcc:indexpattern-datasource-layer-7d16ac75-e86f-47ff-a746-2bf0b9ea6a0f","type":"index-pattern"},{"id":"security-solution-default","name":"a5aaa0eb-0580-4970-a92f-f057b57c17aa:indexpattern-datasource-layer-5c308554-7dc3-4986-b31e-232c976657a2","type":"index-pattern"},{"id":"security-solution-default","name":"7bbec2fb-0ab6-4f6a-8259-cc46f91d5a9b:indexpattern-datasource-layer-73d168b7-3b62-4c83-9f8f-d59ccb1ceea6","type":"index-pattern"},{"id":"security-solution-default","name":"87bdb6b4-2c78-4491-b812-8a05061da493:indexpattern-datasource-layer-310c919e-6479-4a10-b8b9-f0c8feb69262","type":"index-pattern"},{"id":"security-solution-default","name":"3adf3d59-f407-49f8-866d-01868cd2b422:indexpattern-datasource-layer-6bb18b1d-e479-4493-84d0-3e03ae5680af","type":"index-pattern"},{"id":"security-solution-default","name":"f69f88a6-ecca-4d78-955b-73c919f93368:indexpattern-datasource-layer-23379a89-f323-4aed-9a31-697065d9d765","type":"index-pattern"},{"id":"security-solution-default","name":"fd9092c9-08bd-4e55-b7ac-489f201212e6:indexpattern-datasource-layer-c7d7d3a0-dcbd-4ddb-b949-50b2c2ebb9f7","type":"index-pattern"},{"id":"security-solution-default","name":"ce03539a-a246-442b-b6ff-6f0ba127100a:indexpattern-datasource-layer-312ab185-e6dc-4954-b768-b4a32c4b98ba","type":"index-pattern"},{"id":"security-solution-default","name":"6f0757c3-f695-41b3-a455-bcf86da79406:indexpattern-datasource-layer-248cdf95-161c-4de1-84a1-170fcbae975d","type":"index-pattern"}],"type":"dashboard","updated_at":"2022-09-13T08:14:17.462Z","version":"WzY5LDFd"} +{"excludedObjects":[],"excludedObjectsCount":0,"exportedCount":3,"missingRefCount":0,"missingReferences":[]} \ No newline at end of file diff --git a/messaging/config/telemetry-dashboards/logstash/logstash.conf b/messaging/config/telemetry-dashboards/logstash/logstash.conf new file mode 100644 index 0000000..c49ece5 --- /dev/null +++ b/messaging/config/telemetry-dashboards/logstash/logstash.conf @@ -0,0 +1,36 @@ +input { + gelf { + port => 12201 + } +} + +filter { + # Grok expression matches several formats (EE and CE): + #[GIN] 2022/09/09 - 08:33:51 | 200 | 732.753µs | 172.20.0.1 | GET "/sequential" + #[KRAKEND] 2022/09/09 - 08:35:25.813 [AccessLog] | 200 | 92.944122ms | 172.20.0.1 | GET /market/simple + #[KRAKEND][SERVICE: AsyncAgent][AMQP][async-agent-demo] Starting the consumer + grok { + match => { "message" => '(\[%{WORD}\] %{DATA}%{SPACE}-%{SPACE}%{DATA}%{SPACE}(\[AccessLog\]%{SPACE})?\| %{NUMBER:statusCode} \|%{SPACE}%{NUMBER:duration}(m|µ|n|u)?s%{SPACE}\|%{SPACE}%{DATA:ip}%{SPACE}\|%{SPACE}%{WORD:verb}%{SPACE}"?(?[^"]+)"?)?((\[KRAKEND\])?\[%{WORD:scope}(: (?[^\]]+)(\]\[%{DATA:sublevel1})?(\]\[%{DATA:sublevel2})?)?\] %{GREEDYDATA:msg})?'} + } + + if [host] and ![host][name] { + mutate { + rename => { "[host]" => "[host][name]" } + } + } + mutate { + convert => { + "statusCode" => "integer" + "duration" => "float" + } +} +} + +output { + elasticsearch { + hosts => ["http://elasticsearch:9200"] + } + stdout { + codec => rubydebug + } +} diff --git a/messaging/config/telemetry-dashboards/prometheus/prometheus.yml b/messaging/config/telemetry-dashboards/prometheus/prometheus.yml new file mode 100644 index 0000000..737c9c2 --- /dev/null +++ b/messaging/config/telemetry-dashboards/prometheus/prometheus.yml @@ -0,0 +1,18 @@ +global: + scrape_interval: 15s + external_labels: + monitor: krakend_monitor + +scrape_configs: + - job_name: krakend_scrapper + scrape_interval: 5s + metrics_path: '/metrics' + static_configs: + - targets: + - 'krakend_ee:9090' + labels: + app: krakend + - targets: + - '192.168.1.12:9099' + labels: + app: lokrakend diff --git a/messaging/config/telemetry-dashboards/tempo/tempo.yaml b/messaging/config/telemetry-dashboards/tempo/tempo.yaml new file mode 100644 index 0000000..418cc3a --- /dev/null +++ b/messaging/config/telemetry-dashboards/tempo/tempo.yaml @@ -0,0 +1,60 @@ +server: + http_listen_port: 3200 + +query_frontend: + search: + duration_slo: 5s + throughput_bytes_slo: 1.073741824e+09 + trace_by_id: + duration_slo: 5s + +# this configuration will listen on all ports and protocols that tempo is capable of. +# the receives all come from the OpenTelemetry collector. more configuration information can +# be found there: https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver +# for a production deployment you should only enable the receivers you need! +distributor: + receivers: + jaeger: + protocols: + thrift_http: + grpc: + thrift_binary: + thrift_compact: + zipkin: + otlp: + protocols: + http: + grpc: + +# cut the headblock when this much time passes. this is being set for demo purposes and should probably be left alone normally +ingester: + max_block_duration: 5m + +# overall Tempo trace retention. set for demo purposes +compactor: + compaction: + block_retention: 1h + +metrics_generator: + registry: + external_labels: + source: tempo + cluster: docker-compose + storage: + path: /tmp/tempo/generator/wal + remote_write: + - url: http://prometheus:9090/api/v1/write + send_exemplars: true + +storage: + trace: + backend: local # backend configuration to use + wal: + path: /tmp/tempo/wal # where to store the the wal locally + local: + path: /tmp/tempo/blocks + +overrides: + defaults: + metrics_generator: + processors: [service-graphs, span-metrics] # enables metrics generator diff --git a/messaging/docker-compose.yaml b/messaging/docker-compose.yaml new file mode 100644 index 0000000..b541820 --- /dev/null +++ b/messaging/docker-compose.yaml @@ -0,0 +1,84 @@ +services: + kafkabroker: + image: apache/kafka:latest + hostname: kafkabroker + container_name: messaging-kafkabroker + ports: + - 9092:9092 + - 29092:29092 + environment: + KAFKA_BROKER_ID: 1 + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT,CONTROLLER:PLAINTEXT + KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafkabroker:29092,PLAINTEXT_HOST://localhost:9092 + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 + KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 + KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 + KAFKA_PROCESS_ROLES: broker,controller + KAFKA_NODE_ID: 1 + KAFKA_CONTROLLER_QUORUM_VOTERS: 1@kafkabroker:29093 + KAFKA_LISTENERS: PLAINTEXT://kafkabroker:29092,CONTROLLER://kafkabroker:29093,PLAINTEXT_HOST://0.0.0.0:9092 + KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT + KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER + KAFKA_LOG_DIRS: /tmp/kraft-combined-logs + CLUSTER_ID: KRAKENDKAFKACLUSTERID + seckafkabroker: + image: apache/kafka:latest + hostname: seckafkabroker + container_name: messaging-seckafkabroker + volumes: + - ./config/certs:/etc/kafka/secrets + ports: + - 49092:49092 + environment: + KAFKA_SSL_KEYSTORE_FILENAME: keystore.jks + KAFKA_SSL_KEYSTORE_CREDENTIALS: keystore.credentials.txt + KAFKA_SSL_KEY_CREDENTIALS: keystore.credentials.txt + KAFKA_SSL_TRUSTSTORE_FILENAME: keystore.jks + KAFKA_SSL_TRUSTSTORE_CREDENTIALS: keystore.credentials.txt + KAFKA_SSL_CLIENT_AUTH: required + KAFKA_BROKER_ID: 1 + KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SSL:SSL,SSL-INTERNAL:SSL,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT,CONTROLLER:PLAINTEXT + KAFKA_ADVERTISED_LISTENERS: SSL://localhost:49092,SSL-INTERNAL://localhost:59092,PLAINTEXT://seckafkabroker:29092,PLAINTEXT_HOST://localhost:9092 + KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 + KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 + KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 + KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 + KAFKA_PROCESS_ROLES: broker,controller + KAFKA_NODE_ID: 1 + KAFKA_CONTROLLER_QUORUM_VOTERS: 1@seckafkabroker:29093 + KAFKA_LISTENERS: SSL://0.0.0.0:49092,SSL-INTERNAL://localhost:59092,PLAINTEXT://seckafkabroker:29092,CONTROLLER://seckafkabroker:29093,PLAINTEXT_HOST://0.0.0.0:9092 + KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT + KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER + KAFKA_LOG_DIRS: /tmp/kraft-combined-logs + CLUSTER_ID: KRAKENDSECKAFKACLUSTERID + grafana: + image: grafana/grafana:latest + container_name: messaging-grafana + ports: + - "4000:3000" + volumes: + - "./config/telemetry-dashboards/grafana/datasources/prometheus-tempo.yml:/etc/grafana/provisioning/datasources/prometheus-tempo.yml" + - "./config/telemetry-dashboards/grafana/krakend/for-prometheus.json:/var/lib/grafana/dashboards/krakend/for-prometheus.json" + - "./config/telemetry-dashboards/grafana/dashboards/all.yml:/etc/grafana/provisioning/dashboards/all.yml" + environment: + - GF_SECURITY_ADMIN_USER=krakend + - GF_SECURITY_ADMIN_PASSWORD=krakend + prometheus: + image: prom/prometheus:latest + ports: + - "9090:9090" + volumes: + - "./config/telemetry-dashboards/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml" + tempo: + image: grafana/tempo:latest + domainname: tempo + container_name: messaging-tempo + command: [ "-config.file=/etc/tempo.yaml" ] + volumes: + - "./config/telemetry-dashboards/tempo/tempo.yaml:/etc/tempo.yaml" + ports: + - "3200:3200" # tempo + - "9095:9095" # tempo grpc + - "54317:4317" # otlp grpc + - "54318:4318" # otlp http diff --git a/messaging/startup.sh b/messaging/startup.sh new file mode 100755 index 0000000..18dec1d --- /dev/null +++ b/messaging/startup.sh @@ -0,0 +1,40 @@ +#!/bin/sh + +docker compose up -d +echo "waiting for startup ..." +echo "5" +sleep 1 +echo "4" +sleep 1 +echo "3" +sleep 1 +echo "2" +sleep 1 +echo "1" +sleep 1 + +echo "creating topics:" + +echo "creating 'stockprice' topic" +docker exec messaging-kafkabroker \ + /opt/kafka/bin/kafka-topics.sh \ + --bootstrap-server localhost:9092 \ + --create \ + --topic stockprice \ + --partitions 3 + +echo "creating 'orderplacement' topic\n" +docker exec messaging-seckafkabroker \ + /opt/kafka/bin/kafka-topics.sh \ + --bootstrap-server localhost:9092 \ + --create \ + --topic orderplacement \ + --partitions 3 + +echo "creating 'portfolioupdates' topic\n" +docker exec messaging-seckafkabroker \ + /opt/kafka/bin/kafka-topics.sh \ + --bootstrap-server localhost:9092 \ + --create \ + --topic portfolioupdates \ + --partitions 3 From 7b759f3136646499ad6bdb06a686e2af04ad23e1 Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Mon, 16 Feb 2026 14:23:30 +0100 Subject: [PATCH 02/20] wip: generate server and client certificates --- messaging/README.md | 3 +- messaging/clients/consumers/kaf_consume.sh | 4 +- messaging/clients/producers/kaf.sh | 1 - messaging/config/.gitignore | 5 + messaging/config/README.md | 20 ++++ messaging/config/ca/01_gen_ca.sh | 11 +++ messaging/config/ca/02_add_ca_to_keystore.sh | 12 +++ .../config/ca/03_sign_certificat_request.sh | 18 ++++ messaging/config/ca/openssl-ca.cnf | 81 ++++++++++++++++ messaging/config/cert_gen/01_gen_key_pairs.sh | 20 ++++ .../cert_gen/02_gen_cert_signing_request.sh | 10 ++ .../config/cert_gen/03_gen_client_keypair.sh | 6 ++ messaging/config/env.sh | 43 +++++++++ messaging/config/krakend.json | 92 +++++++++++++++++++ 14 files changed, 320 insertions(+), 6 deletions(-) create mode 100644 messaging/config/.gitignore create mode 100644 messaging/config/README.md create mode 100755 messaging/config/ca/01_gen_ca.sh create mode 100755 messaging/config/ca/02_add_ca_to_keystore.sh create mode 100755 messaging/config/ca/03_sign_certificat_request.sh create mode 100644 messaging/config/ca/openssl-ca.cnf create mode 100644 messaging/config/cert_gen/01_gen_key_pairs.sh create mode 100644 messaging/config/cert_gen/02_gen_cert_signing_request.sh create mode 100755 messaging/config/cert_gen/03_gen_client_keypair.sh create mode 100644 messaging/config/env.sh create mode 100644 messaging/config/krakend.json diff --git a/messaging/README.md b/messaging/README.md index ccf563f..4328058 100644 --- a/messaging/README.md +++ b/messaging/README.md @@ -22,9 +22,8 @@ Along with services for telemetry: [##](##) Producing messages In order to produce messages you will need to have installed the -`kaf` tool. +`kaf` tool: [https://github.com/birdayz/kaf](https://github.com/birdayz/kaf). -# TODO: explain how to install the kaf tool ## "Story Telling" diff --git a/messaging/clients/consumers/kaf_consume.sh b/messaging/clients/consumers/kaf_consume.sh index 775519a..8f6dce5 100755 --- a/messaging/clients/consumers/kaf_consume.sh +++ b/messaging/clients/consumers/kaf_consume.sh @@ -1,7 +1,5 @@ #/bin/bash - -export KTOPIC=stockprices - +export KTOPIC=stockprice kaf consume \ ${KTOPIC} \ -v \ diff --git a/messaging/clients/producers/kaf.sh b/messaging/clients/producers/kaf.sh index 1e16b60..3412cd4 100755 --- a/messaging/clients/producers/kaf.sh +++ b/messaging/clients/producers/kaf.sh @@ -8,7 +8,6 @@ echo -e "Producing: $KKEY into '$KTOPIC' topic\n" SLEEP_PERIOD=5 PRICES=("309.28", "312.59", "315.7", "314.68", "311.9", "309.70", "319.00") - for p in ${PRICES[@]}; do echo "producing price ${p}" export PRICE=$p diff --git a/messaging/config/.gitignore b/messaging/config/.gitignore new file mode 100644 index 0000000..0d4fe25 --- /dev/null +++ b/messaging/config/.gitignore @@ -0,0 +1,5 @@ +ca/ca_database_index.txt +ca/ca_serial.txt +ca/cacert.pem +ca/cakey.pem +certs diff --git a/messaging/config/README.md b/messaging/config/README.md new file mode 100644 index 0000000..7a852b2 --- /dev/null +++ b/messaging/config/README.md @@ -0,0 +1,20 @@ +# Generate CA and certificates + +1. Edit the `env.sh` file, and check the environment vars + to know where the files will be placed. + +2. Source the `env.sh` file + +```bash +source ./env.sh +``` + +1. Enter the `ca` dir, to generate the Certificate Authority + - `./01_gen_va.sh` + - `./02_add_ca_to_keystore.sh` + +2. Go to the `cert_gens` dir, and create a certificate, + with its signing request. + + + - `./03_sign_certificat_request.sh` diff --git a/messaging/config/ca/01_gen_ca.sh b/messaging/config/ca/01_gen_ca.sh new file mode 100755 index 0000000..42e9563 --- /dev/null +++ b/messaging/config/ca/01_gen_ca.sh @@ -0,0 +1,11 @@ +#/bin/bash + +# Create the "root" CA keypair / certificate +openssl \ + req -x509 \ + -config openssl-ca.cnf \ + -newkey rsa:4096 \ + -sha256 \ + -nodes \ + -out cacert.pem \ + -outform PEM diff --git a/messaging/config/ca/02_add_ca_to_keystore.sh b/messaging/config/ca/02_add_ca_to_keystore.sh new file mode 100755 index 0000000..50eba82 --- /dev/null +++ b/messaging/config/ca/02_add_ca_to_keystore.sh @@ -0,0 +1,12 @@ +#/bin/bash + +# This add the CA to the server keystore (for kafka), +# when making requests, we either need to add the +# CA to the system valid CA's or if using java, adding +# it to its keystore too +keytool \ + -keystore ${KEYSTORE_FILE} \ + -alias KrakenDCARoot \ + -import \ + -file cacert.pem + diff --git a/messaging/config/ca/03_sign_certificat_request.sh b/messaging/config/ca/03_sign_certificat_request.sh new file mode 100755 index 0000000..4ca30a5 --- /dev/null +++ b/messaging/config/ca/03_sign_certificat_request.sh @@ -0,0 +1,18 @@ +#/bin/bash + +if [ ! -f "ca_database_index.txt" ]; then + touch ca_database_index.txt + echo "0001" > ca_serial.txt +fi +openssl \ + ca -config openssl-ca.cnf \ + -policy signing_policy \ + -extensions signing_req \ + -out ${CLIENT_SIGNED_CERT} \ + -infiles ${CLIENT_CERT_SIGN_REQUEST} + +# keytool \ +# -keystore ${KEYSTORE_FILE} \ +# -alias localhost \ +# -import \ +# -file $1 diff --git a/messaging/config/ca/openssl-ca.cnf b/messaging/config/ca/openssl-ca.cnf new file mode 100644 index 0000000..da12401 --- /dev/null +++ b/messaging/config/ca/openssl-ca.cnf @@ -0,0 +1,81 @@ +HOME = . +RANDFILE = $ENV::HOME/.rnd + +#################################################################### +[ ca ] +default_ca = CA_default # The default ca section + +[ CA_default ] + +base_dir = . +certificate = $base_dir/cacert.pem # The CA certificate +private_key = $base_dir/cakey.pem # The CA private key +new_certs_dir = $base_dir # Location for new certs after signing +database = $base_dir/ca_database_index.txt # Database index file +serial = $base_dir/ca_serial.txt # The current serial number + +default_days = 36500 # How long to certify for +default_crl_days = 30 # How long before next CRL +default_md = sha256 # Use public key default MD +preserve = no # Keep passed DN ordering + +x509_extensions = ca_extensions # The extensions to add to the cert + +email_in_dn = no # Don't concat the email in the DN +copy_extensions = copy # Required to copy SANs from CSR to cert + +#################################################################### +[ req ] +default_bits = 4096 +default_keyfile = cakey.pem +distinguished_name = ca_distinguished_name +x509_extensions = ca_extensions +string_mask = utf8only + +#################################################################### +[ ca_distinguished_name ] +countryName = Country Name (2 letter code) +countryName_default = ES + +stateOrProvinceName = State or Province Name (full name) +stateOrProvinceName_default = Barcelona + +localityName = Locality Name (eg, city) +localityName_default = Vic + +organizationName = Organization Name (eg, company) +organizationName_default = DevCertiKrakenD + +organizationalUnitName = Organizational Unit (eg, division) +organizationalUnitName_default = DevSelfSignKrakenD + +commonName = Common Name (e.g. server FQDN or YOUR name) +commonName_default = certikrakend.dev + +emailAddress = Email Address +emailAddress_default = admin@certikrakend.dev + +#################################################################### +[ ca_extensions ] + +subjectKeyIdentifier = hash +authorityKeyIdentifier = keyid:always, issuer +basicConstraints = critical, CA:true +keyUsage = keyCertSign, cRLSign + +#################################################################### +[ signing_policy ] +countryName = optional +stateOrProvinceName = optional +localityName = optional +organizationName = optional +organizationalUnitName = optional +commonName = supplied +emailAddress = optional + +#################################################################### +[ signing_req ] +subjectKeyIdentifier = hash +authorityKeyIdentifier = keyid,issuer +basicConstraints = CA:FALSE +keyUsage = digitalSignature, keyEncipherment diff --git a/messaging/config/cert_gen/01_gen_key_pairs.sh b/messaging/config/cert_gen/01_gen_key_pairs.sh new file mode 100644 index 0000000..b49e4e6 --- /dev/null +++ b/messaging/config/cert_gen/01_gen_key_pairs.sh @@ -0,0 +1,20 @@ +#/bin/bash + +# Generate the key pair for the server +keytool \ + -keystore ${KEYSTORE_FILE} \ + -alias localhost \ + -validity ${VALIDITY} \ + -genkey \ + -keyalg RSA \ + -storetype pkcs12 + +# Generate the signing request for the generated key pair +keytool \ + -keystore ${KEYSTORE_FILE} \ + -certreq \ + -alias localhost \ + -keyalg RSA \ + -storetype pkcs12 \ + -file ${SERVER_CERT_SIGN_REQUEST} \ + -ext SAN=DNS:${SERVER_FQDN},IP:${SERVER_IPADDRESS} diff --git a/messaging/config/cert_gen/02_gen_cert_signing_request.sh b/messaging/config/cert_gen/02_gen_cert_signing_request.sh new file mode 100644 index 0000000..8c407b6 --- /dev/null +++ b/messaging/config/cert_gen/02_gen_cert_signing_request.sh @@ -0,0 +1,10 @@ +#/bin/bash + +# keytool \ +# -keystore ${KEYSTORE_FILE} \ +# -certreq \ +# -alias localhost \ +# -keyalg RSA \ +# -storetype pkcs12 \ +# -file ${SERVER_CERT_SIGN_REQUEST} \ +# -ext SAN=DNS:${SERVER_FQDN},IP:${SERVER_IPADDRESS} diff --git a/messaging/config/cert_gen/03_gen_client_keypair.sh b/messaging/config/cert_gen/03_gen_client_keypair.sh new file mode 100755 index 0000000..6b7fcf0 --- /dev/null +++ b/messaging/config/cert_gen/03_gen_client_keypair.sh @@ -0,0 +1,6 @@ +#!/bin/bash + +openssl \ + req -newkey rsa:2048 \ + -keyout ${CLIENT_CERT_KEYPAIR} \ + -out ${CLIENT_CERT_SIGN_REQUEST} diff --git a/messaging/config/env.sh b/messaging/config/env.sh new file mode 100644 index 0000000..3c82268 --- /dev/null +++ b/messaging/config/env.sh @@ -0,0 +1,43 @@ +#/bin/bash + +mkdir -p ./certs/server +mkdir -p ./certs/client + +export SERVER_CERT_SIGN_REQUEST=${PWD}/certs/server/localhost.csr +export SERVER_FQDN=localhost +export SERVER_IPADDRESS=127.0.0.1 + +export CLIENT_CERT_KEYPAIR=${PWD}/certs/client/client.key +export CLIENT_CERT_SIGN_REQUEST=${PWD}/certs/client/client.csr +export CLIENT_SIGNED_CERT=${PWD}/certs/client/client_cert.pem + +export KEYSTORE_FILE=${PWD}/certs/keystore.jks +export VALIDITY=3650 + +echo " " +echo "--------------" +echo "Creating CA:" +echo "--------------" + +cd ca +. ./01_gen_ca.sh +. ./02_add_ca_to_keystore.sh +cd .. + +echo " " +echo "--------------" +echo "Creating Server Certificate" +echo "--------------" + +cd cert_gen +. ./01_gen_key_pairs.sh +. ./03_gen_client_keypair.sh +cd .. + +echo " " +echo "--------------" +echo "Creating Client Certificate" +echo "--------------" +cd ca +. ./03_sign_certificat_request.sh $CLIENT_CERT_SIGN_REQUEST +cd .. diff --git a/messaging/config/krakend.json b/messaging/config/krakend.json new file mode 100644 index 0000000..9c022b2 --- /dev/null +++ b/messaging/config/krakend.json @@ -0,0 +1,92 @@ +{ + "version": 3, + "debug_endpoint": true, + "host": ["http://localhost:8080"], + "async_agent": [ + { + "name": "stocksconsumer", + "extra_config": { + "async/kafka": { + "group_id": "my_group_id", + "topics": [ + "krafka" + ], + "connection": { + "brokers": [ + "localhost:9092" + ], + "client_id": "bartolo" + }, + "consumer": {} + } + }, + "connection": { + "max_retries": 2, + "backoff_strategy": "linear", + "health_interval": "30s" + }, + "consumer": { + "topic": "*", + "workers": 1, + "timeout": "1s" + }, + "backend": [ + { + "url_pattern": "/__debug/hi" + }, + { + "extra_config": { + "backend/pubsub/publisher/kafka": { + + } + } + } + ] + }, + { + "name": "portfolioupdatesconsumer", + "extra_config": { + "async/kafka": { + "group_id": "my_group_id", + "topics": [ + "krafka" + ], + "connection": { + "brokers": [ + "shrimp.ln:9092", + "localhost:49092" + ], + "client_id": "bartolo" + }, + "consumer": {} + } + }, + "connection": { + "max_retries": 2, + "backoff_strategy": "linear", + "health_interval": "30s" + }, + "consumer": { + "topic": "*", + "workers": 1, + "timeout": "1s" + }, + "backend": [ + { + "url_pattern": "/__debug/hi" + } + ] + } + ], + "endpoint": [ + { + "path" + "backend": [ + { + + "extra_config": + } + ] + } + ] +} From fb79e0ea2d55d8fb658503681ae0075bcdc3fc8a Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Mon, 16 Feb 2026 22:21:13 +0100 Subject: [PATCH 03/20] =?UTF-8?q?why=20the=20self=20signed=20cert=20is=20n?= =?UTF-8?q?ot=20working=20=F0=9F=98=B1=20!=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- messaging/README.md | 5 ++ messaging/clients/producers/kaf_ssl.sh | 10 ++++ messaging/clients/producers/kaf_ssl_conf.yaml | 9 +++ messaging/config/README.md | 17 ++++++ .../config/ca/03_sign_certificat_request.sh | 5 +- messaging/config/ca/openssl-ca.cnf | 6 +- .../config/cert_gen/03_gen_client_keypair.sh | 10 +++- messaging/config/cert_gen/extfile.cnf | 1 + messaging/config/cert_gen/san.cnf | 16 +++++ messaging/config/env.sh | 33 +---------- messaging/config/setup.sh | 58 +++++++++++++++++++ messaging/docker-compose.yaml | 1 + 12 files changed, 135 insertions(+), 36 deletions(-) create mode 100755 messaging/clients/producers/kaf_ssl.sh create mode 100644 messaging/clients/producers/kaf_ssl_conf.yaml create mode 100644 messaging/config/cert_gen/extfile.cnf create mode 100644 messaging/config/cert_gen/san.cnf create mode 100644 messaging/config/setup.sh diff --git a/messaging/README.md b/messaging/README.md index 4328058..a85dcfd 100644 --- a/messaging/README.md +++ b/messaging/README.md @@ -25,6 +25,11 @@ In order to produce messages you will need to have installed the `kaf` tool: [https://github.com/birdayz/kaf](https://github.com/birdayz/kaf). + +### Kaf to produce message with SSL TLS + +https://github.com/birdayz/kaf/blob/master/examples/ssl_keys.yaml + ## "Story Telling" The `kafkabroker` is a source of information for different market diff --git a/messaging/clients/producers/kaf_ssl.sh b/messaging/clients/producers/kaf_ssl.sh new file mode 100755 index 0000000..be93d1f --- /dev/null +++ b/messaging/clients/producers/kaf_ssl.sh @@ -0,0 +1,10 @@ +#/bin/bash + +kaf produce \ + krafka \ + --config ./kaf_ssl_conf.yaml \ + --cluster seckafkabroker \ + -H Content-Type:application/json \ + -k $(date +%Y%m%d_%H%M%S) \ + -v \ + --input-mode full < kaf_payload.json diff --git a/messaging/clients/producers/kaf_ssl_conf.yaml b/messaging/clients/producers/kaf_ssl_conf.yaml new file mode 100644 index 0000000..3247914 --- /dev/null +++ b/messaging/clients/producers/kaf_ssl_conf.yaml @@ -0,0 +1,9 @@ +clusters: + - name: seckafkabroker + brokers: + - localhost:49092 + TLS: + cafile: "../../config/ca/cacert.pem" + clientfile: "../../config/certs/client/client.signed.pem" + clientkeyfile: "../../config/certs/client/client.passwordless.key" + insecure: false diff --git a/messaging/config/README.md b/messaging/config/README.md index 7a852b2..9075341 100644 --- a/messaging/config/README.md +++ b/messaging/config/README.md @@ -1,5 +1,17 @@ # Generate CA and certificates +To generate the example you should use these passwords: + +- for keystore: `ksp4ssword` +- for client certificate: `cl1entpass` + +You can select other passwords, but then you will need to change the +passwords in: + +- `certs/keystore.credentials.txt`: for the keystore +- `clients/producers/ka_fssl_client_cert_password`: for the client certificate + + 1. Edit the `env.sh` file, and check the environment vars to know where the files will be placed. @@ -18,3 +30,8 @@ source ./env.sh - `./03_sign_certificat_request.sh` + +**Edit the `certs/keystore.credentials.txt`** and change the placeholder +password `my_password` for the password used for the keystore. This +file is used by the dockerized secure kafka instance to read the +"secret" password for the keystore. diff --git a/messaging/config/ca/03_sign_certificat_request.sh b/messaging/config/ca/03_sign_certificat_request.sh index 4ca30a5..bf53e56 100755 --- a/messaging/config/ca/03_sign_certificat_request.sh +++ b/messaging/config/ca/03_sign_certificat_request.sh @@ -4,14 +4,15 @@ if [ ! -f "ca_database_index.txt" ]; then touch ca_database_index.txt echo "0001" > ca_serial.txt fi + openssl \ ca -config openssl-ca.cnf \ -policy signing_policy \ -extensions signing_req \ -out ${CLIENT_SIGNED_CERT} \ - -infiles ${CLIENT_CERT_SIGN_REQUEST} + -infiles ${CLIENT_CERT_SIGN_REQUEST} -# keytool \ +#subjectKeyIdentifier = hash # -keystore ${KEYSTORE_FILE} \ # -alias localhost \ # -import \ diff --git a/messaging/config/ca/openssl-ca.cnf b/messaging/config/ca/openssl-ca.cnf index da12401..d0c05e8 100644 --- a/messaging/config/ca/openssl-ca.cnf +++ b/messaging/config/ca/openssl-ca.cnf @@ -76,6 +76,8 @@ emailAddress = optional #################################################################### [ signing_req ] subjectKeyIdentifier = hash -authorityKeyIdentifier = keyid,issuer +authorityKeyIdentifier = keyid:always,issuer:always basicConstraints = CA:FALSE -keyUsage = digitalSignature, keyEncipherment +keyUsage = digitalSignature, keyEncipherment, dataEncipherment, nonRepudiation, keyCertSign, keyAgreement +subjectAltName = DNS:localhost, DNS:seckafkabroker +issuerAltName = issuer:copy diff --git a/messaging/config/cert_gen/03_gen_client_keypair.sh b/messaging/config/cert_gen/03_gen_client_keypair.sh index 6b7fcf0..34f7622 100755 --- a/messaging/config/cert_gen/03_gen_client_keypair.sh +++ b/messaging/config/cert_gen/03_gen_client_keypair.sh @@ -1,6 +1,14 @@ #!/bin/bash +# openssl \ +# req -newkey rsa:2048 \ +# -keyout ${CLIENT_CERT_KEYPAIR} \ +# -out ${CLIENT_CERT_SIGN_REQUEST} +# openssl \ req -newkey rsa:2048 \ + -subj '/CN=localhost/OU=TEST/O=KrakenD/L=Girona/ST=Girona/C=ES' \ -keyout ${CLIENT_CERT_KEYPAIR} \ - -out ${CLIENT_CERT_SIGN_REQUEST} + -out ${CLIENT_CERT_SIGN_REQUEST} \ + -nodes \ + -config ./san.cnf diff --git a/messaging/config/cert_gen/extfile.cnf b/messaging/config/cert_gen/extfile.cnf new file mode 100644 index 0000000..aafe5bd --- /dev/null +++ b/messaging/config/cert_gen/extfile.cnf @@ -0,0 +1 @@ +subjectAltName=DNS:localhost diff --git a/messaging/config/cert_gen/san.cnf b/messaging/config/cert_gen/san.cnf new file mode 100644 index 0000000..a081393 --- /dev/null +++ b/messaging/config/cert_gen/san.cnf @@ -0,0 +1,16 @@ +[ req ] +default_bits = 2048 +distinguished_name = req_distinguished_name +req_extensions = req_ext +prompt = no # <--- This is required to fix OpenSSL output bug +[ req_distinguished_name ] +countryName = ES +stateOrProvinceName = CA +localityName = Girona +organizationName = ExamplesKrakend +commonName = seckafkabroker +[ req_ext ] +subjectAltName = @alt_names +[alt_names] +DNS.1 = localhost +DNS.2 = seckafkabroker diff --git a/messaging/config/env.sh b/messaging/config/env.sh index 3c82268..b257898 100644 --- a/messaging/config/env.sh +++ b/messaging/config/env.sh @@ -1,43 +1,14 @@ #/bin/bash -mkdir -p ./certs/server -mkdir -p ./certs/client - export SERVER_CERT_SIGN_REQUEST=${PWD}/certs/server/localhost.csr export SERVER_FQDN=localhost export SERVER_IPADDRESS=127.0.0.1 export CLIENT_CERT_KEYPAIR=${PWD}/certs/client/client.key export CLIENT_CERT_SIGN_REQUEST=${PWD}/certs/client/client.csr -export CLIENT_SIGNED_CERT=${PWD}/certs/client/client_cert.pem +export CLIENT_SIGNED_CERT=${PWD}/certs/client/client.signed.pem +export CLIENT_CERT_KEYPAIR_PASSWORDLESS=${PWD}/certs/client/client.passwordless.key export KEYSTORE_FILE=${PWD}/certs/keystore.jks export VALIDITY=3650 -echo " " -echo "--------------" -echo "Creating CA:" -echo "--------------" - -cd ca -. ./01_gen_ca.sh -. ./02_add_ca_to_keystore.sh -cd .. - -echo " " -echo "--------------" -echo "Creating Server Certificate" -echo "--------------" - -cd cert_gen -. ./01_gen_key_pairs.sh -. ./03_gen_client_keypair.sh -cd .. - -echo " " -echo "--------------" -echo "Creating Client Certificate" -echo "--------------" -cd ca -. ./03_sign_certificat_request.sh $CLIENT_CERT_SIGN_REQUEST -cd .. diff --git a/messaging/config/setup.sh b/messaging/config/setup.sh new file mode 100644 index 0000000..585325d --- /dev/null +++ b/messaging/config/setup.sh @@ -0,0 +1,58 @@ +#/bin/bash + +mkdir -p ./certs/server +mkdir -p ./certs/client + +. env.sh +# export SERVER_CERT_SIGN_REQUEST=${PWD}/certs/server/localhost.csr +# export SERVER_FQDN=localhost +# export SERVER_IPADDRESS=127.0.0.1 +# +# export CLIENT_CERT_KEYPAIR=${PWD}/certs/client/client.key +# export CLIENT_CERT_SIGN_REQUEST=${PWD}/certs/client/client.csr +# export CLIENT_SIGNED_CERT=${PWD}/certs/client/client.signed.pem +# export CLIENT_CERT_KEYPAIR_PASSWORDLESS=${PWD}/certs/client/client.passwordless.key +# +# export KEYSTORE_FILE=${PWD}/certs/keystore.jks +# export VALIDITY=3650 + +echo " " +echo "--------------" +echo "Creating CA:" +echo "--------------" + +cd ca +. ./01_gen_ca.sh +. ./02_add_ca_to_keystore.sh +cd .. + +echo " " +echo "--------------" +echo "Creating Server Certificate" +echo "--------------" + +cd cert_gen +. ./01_gen_key_pairs.sh +echo " " +echo "--------------" +echo "Creating Client Certificate" +echo "--------------" +. ./03_gen_client_keypair.sh +cd .. + +echo " " +echo "--------------" +echo "Signing Client Certificate" +echo "--------------" +cd ca +. ./03_sign_certificat_request.sh $CLIENT_CERT_SIGN_REQUEST +cd .. + + +echo " " +echo "--------------" +echo "Remove password from client key" +echo "--------------" +cd cert_gen +. ./04_remove_password_from_client_key.sh +cd .. diff --git a/messaging/docker-compose.yaml b/messaging/docker-compose.yaml index b541820..30cc2d8 100644 --- a/messaging/docker-compose.yaml +++ b/messaging/docker-compose.yaml @@ -37,6 +37,7 @@ services: KAFKA_SSL_TRUSTSTORE_FILENAME: keystore.jks KAFKA_SSL_TRUSTSTORE_CREDENTIALS: keystore.credentials.txt KAFKA_SSL_CLIENT_AUTH: required + KAFKA_SSL_VERIFY_HOSTNAME: false KAFKA_BROKER_ID: 1 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SSL:SSL,SSL-INTERNAL:SSL,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT,CONTROLLER:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: SSL://localhost:49092,SSL-INTERNAL://localhost:59092,PLAINTEXT://seckafkabroker:29092,PLAINTEXT_HOST://localhost:9092 From 635154b58b1192b56e490c57ef805d288250b85d Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Mon, 16 Feb 2026 23:45:10 +0100 Subject: [PATCH 04/20] now it works, so, will squash previous commit emoji --- messaging/clients/producers/kaf_ssl_conf.yaml | 2 +- messaging/config/ca/03_sign_certificat_request.sh | 6 ++++++ messaging/config/ca/openssl-ca.cnf | 2 +- messaging/config/cert_gen/03_gen_client_keypair.sh | 11 +++++++++++ .../config/cert_gen/05_import_signed_server_cert.sh | 7 +++++++ messaging/config/env.sh | 1 + messaging/docker-compose.yaml | 1 - 7 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 messaging/config/cert_gen/05_import_signed_server_cert.sh diff --git a/messaging/clients/producers/kaf_ssl_conf.yaml b/messaging/clients/producers/kaf_ssl_conf.yaml index 3247914..573deb1 100644 --- a/messaging/clients/producers/kaf_ssl_conf.yaml +++ b/messaging/clients/producers/kaf_ssl_conf.yaml @@ -1,7 +1,7 @@ clusters: - name: seckafkabroker brokers: - - localhost:49092 + - seckafkabroker:49092 TLS: cafile: "../../config/ca/cacert.pem" clientfile: "../../config/certs/client/client.signed.pem" diff --git a/messaging/config/ca/03_sign_certificat_request.sh b/messaging/config/ca/03_sign_certificat_request.sh index bf53e56..bc0be76 100755 --- a/messaging/config/ca/03_sign_certificat_request.sh +++ b/messaging/config/ca/03_sign_certificat_request.sh @@ -12,6 +12,12 @@ openssl \ -out ${CLIENT_SIGNED_CERT} \ -infiles ${CLIENT_CERT_SIGN_REQUEST} +openssl \ + ca -config openssl-ca.cnf \ + -policy signing_policy \ + -extensions signing_req \ + -out ${SERVER_SIGNED_CERT} \ + -infiles ${SERVER_CERT_SIGN_REQUEST} #subjectKeyIdentifier = hash # -keystore ${KEYSTORE_FILE} \ # -alias localhost \ diff --git a/messaging/config/ca/openssl-ca.cnf b/messaging/config/ca/openssl-ca.cnf index d0c05e8..dbb7349 100644 --- a/messaging/config/ca/openssl-ca.cnf +++ b/messaging/config/ca/openssl-ca.cnf @@ -59,7 +59,7 @@ emailAddress_default = admin@certikrakend.dev [ ca_extensions ] subjectKeyIdentifier = hash -authorityKeyIdentifier = keyid:always, issuer +authorityKeyIdentifier = keyid:always, issuer:always basicConstraints = critical, CA:true keyUsage = keyCertSign, cRLSign diff --git a/messaging/config/cert_gen/03_gen_client_keypair.sh b/messaging/config/cert_gen/03_gen_client_keypair.sh index 34f7622..5bbb779 100755 --- a/messaging/config/cert_gen/03_gen_client_keypair.sh +++ b/messaging/config/cert_gen/03_gen_client_keypair.sh @@ -5,6 +5,7 @@ # -keyout ${CLIENT_CERT_KEYPAIR} \ # -out ${CLIENT_CERT_SIGN_REQUEST} # +# openssl \ req -newkey rsa:2048 \ -subj '/CN=localhost/OU=TEST/O=KrakenD/L=Girona/ST=Girona/C=ES' \ @@ -12,3 +13,13 @@ openssl \ -out ${CLIENT_CERT_SIGN_REQUEST} \ -nodes \ -config ./san.cnf + +# export CERT_NAME='client' +# +# keytool -keystore $KEYSTORE_FILE \ +# -alias $CERT_NAME \ +# -certreq \ +# -file $CERT_NAME.csr \ +# -storepass ksp4ssword \ +# -keypass ksp4ssword \ +# -ext "SAN=dns:$CERT_NAME,dns:localhost" diff --git a/messaging/config/cert_gen/05_import_signed_server_cert.sh b/messaging/config/cert_gen/05_import_signed_server_cert.sh new file mode 100644 index 0000000..450e225 --- /dev/null +++ b/messaging/config/cert_gen/05_import_signed_server_cert.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +keytool + -importcert \ + -keystore ${KEYSTORE_FILE} \ + -alias localhost \ + -file ${SERVER_SIGNED_CERT} diff --git a/messaging/config/env.sh b/messaging/config/env.sh index b257898..a5c8869 100644 --- a/messaging/config/env.sh +++ b/messaging/config/env.sh @@ -1,6 +1,7 @@ #/bin/bash export SERVER_CERT_SIGN_REQUEST=${PWD}/certs/server/localhost.csr +export SERVER_SIGNED_CERT=${PWD}/certs/server/localhost.signed.pem export SERVER_FQDN=localhost export SERVER_IPADDRESS=127.0.0.1 diff --git a/messaging/docker-compose.yaml b/messaging/docker-compose.yaml index 30cc2d8..b541820 100644 --- a/messaging/docker-compose.yaml +++ b/messaging/docker-compose.yaml @@ -37,7 +37,6 @@ services: KAFKA_SSL_TRUSTSTORE_FILENAME: keystore.jks KAFKA_SSL_TRUSTSTORE_CREDENTIALS: keystore.credentials.txt KAFKA_SSL_CLIENT_AUTH: required - KAFKA_SSL_VERIFY_HOSTNAME: false KAFKA_BROKER_ID: 1 KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: SSL:SSL,SSL-INTERNAL:SSL,PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT,CONTROLLER:PLAINTEXT KAFKA_ADVERTISED_LISTENERS: SSL://localhost:49092,SSL-INTERNAL://localhost:59092,PLAINTEXT://seckafkabroker:29092,PLAINTEXT_HOST://localhost:9092 From f06dec056ae3f49c36725d8010145dd9c30f7fa9 Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Tue, 17 Feb 2026 18:21:07 +0100 Subject: [PATCH 05/20] checkpoint: backup files before clean up --- messaging/clients/producers/kaf_ssl_conf.yaml | 4 +- messaging/config/ca/01_gen_ca.sh | 4 + messaging/config/ca/02_add_ca_to_keystore.sh | 41 ++++++ .../config/ca/03_sign_certificat_request.sh | 1 + messaging/config/ca/keystore.credentials.txt | 1 + messaging/config/ca/san.cnf | 16 +++ messaging/config/ca/v3.ext | 6 + messaging/config/cert_gen/01_gen_key_pairs.sh | 18 --- .../04_remove_password_from_client_key.sh | 5 + messaging/config/cleanup.sh | 4 + messaging/config/env.sh | 2 +- messaging/config/setup.sh | 120 +++++++++++++----- 12 files changed, 172 insertions(+), 50 deletions(-) create mode 100644 messaging/config/ca/keystore.credentials.txt create mode 100644 messaging/config/ca/san.cnf create mode 100644 messaging/config/ca/v3.ext create mode 100644 messaging/config/cert_gen/04_remove_password_from_client_key.sh create mode 100644 messaging/config/cleanup.sh diff --git a/messaging/clients/producers/kaf_ssl_conf.yaml b/messaging/clients/producers/kaf_ssl_conf.yaml index 573deb1..5ce2d91 100644 --- a/messaging/clients/producers/kaf_ssl_conf.yaml +++ b/messaging/clients/producers/kaf_ssl_conf.yaml @@ -1,9 +1,9 @@ clusters: - name: seckafkabroker brokers: - - seckafkabroker:49092 + - localhost:49092 TLS: cafile: "../../config/ca/cacert.pem" clientfile: "../../config/certs/client/client.signed.pem" - clientkeyfile: "../../config/certs/client/client.passwordless.key" + clientkeyfile: "../../config/certs/client/client.key" insecure: false diff --git a/messaging/config/ca/01_gen_ca.sh b/messaging/config/ca/01_gen_ca.sh index 42e9563..bdb4927 100755 --- a/messaging/config/ca/01_gen_ca.sh +++ b/messaging/config/ca/01_gen_ca.sh @@ -1,6 +1,10 @@ #/bin/bash # Create the "root" CA keypair / certificate +echo " " +echo "--------------" +echo " Creating CA certificate:" +echo "--------------" openssl \ req -x509 \ -config openssl-ca.cnf \ diff --git a/messaging/config/ca/02_add_ca_to_keystore.sh b/messaging/config/ca/02_add_ca_to_keystore.sh index 50eba82..d0cb3cc 100755 --- a/messaging/config/ca/02_add_ca_to_keystore.sh +++ b/messaging/config/ca/02_add_ca_to_keystore.sh @@ -4,9 +4,50 @@ # when making requests, we either need to add the # CA to the system valid CA's or if using java, adding # it to its keystore too +echo " " +echo "--------------" +echo " Importing CA Cert to Keystore file:" +echo " ${KEYSTORE_FILE}" +echo "--------------" keytool \ -keystore ${KEYSTORE_FILE} \ -alias KrakenDCARoot \ -import \ -file cacert.pem +# Generate the key pair for the server +echo " " +echo "--------------" +echo " Generating Secure Kafka Server Key: " +echo "--------------" +keytool \ + -keystore ${KEYSTORE_FILE} \ + -alias localhost \ + -validity ${VALIDITY} \ + -genkey \ + -keyalg RSA \ + -storetype pkcs12 + +# Generate the signing request for the generated key pair +echo " " +echo "--------------" +echo " Generating Secure Kafka Server SIGNING REQUEST: " +echo "--------------" +keytool \ + -keystore ${KEYSTORE_FILE} \ + -certreq \ + -alias localhost \ + -keyalg RSA \ + -storetype pkcs12 \ + -file ${SERVER_CERT_SIGN_REQUEST} \ + -ext SAN=DNS:${SERVER_FQDN},IP:${SERVER_IPADDRESS} + + +echo " " +echo "--------------" +echo " Generating Client Key Pair and SIGNING REQUEST: " +echo "--------------" +openssl \ + req -newkey rsa:2048 \ + -keyout ${CLIENT_CERT_KEYPAIR} \ + -out ${CLIENT_CERT_SIGN_REQUEST} diff --git a/messaging/config/ca/03_sign_certificat_request.sh b/messaging/config/ca/03_sign_certificat_request.sh index bc0be76..3339aae 100755 --- a/messaging/config/ca/03_sign_certificat_request.sh +++ b/messaging/config/ca/03_sign_certificat_request.sh @@ -18,6 +18,7 @@ openssl \ -extensions signing_req \ -out ${SERVER_SIGNED_CERT} \ -infiles ${SERVER_CERT_SIGN_REQUEST} + #subjectKeyIdentifier = hash # -keystore ${KEYSTORE_FILE} \ # -alias localhost \ diff --git a/messaging/config/ca/keystore.credentials.txt b/messaging/config/ca/keystore.credentials.txt new file mode 100644 index 0000000..277c048 --- /dev/null +++ b/messaging/config/ca/keystore.credentials.txt @@ -0,0 +1 @@ +ksp4ssword diff --git a/messaging/config/ca/san.cnf b/messaging/config/ca/san.cnf new file mode 100644 index 0000000..a081393 --- /dev/null +++ b/messaging/config/ca/san.cnf @@ -0,0 +1,16 @@ +[ req ] +default_bits = 2048 +distinguished_name = req_distinguished_name +req_extensions = req_ext +prompt = no # <--- This is required to fix OpenSSL output bug +[ req_distinguished_name ] +countryName = ES +stateOrProvinceName = CA +localityName = Girona +organizationName = ExamplesKrakend +commonName = seckafkabroker +[ req_ext ] +subjectAltName = @alt_names +[alt_names] +DNS.1 = localhost +DNS.2 = seckafkabroker diff --git a/messaging/config/ca/v3.ext b/messaging/config/ca/v3.ext new file mode 100644 index 0000000..0d6d5b4 --- /dev/null +++ b/messaging/config/ca/v3.ext @@ -0,0 +1,6 @@ +subjectKeyIdentifier = hash +authorityKeyIdentifier = keyid:always,issuer:always +basicConstraints = CA:FALSE +keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign +subjectAltName = DNS:localhost, DNS:seckafkabroker +issuerAltName = issuer:copy diff --git a/messaging/config/cert_gen/01_gen_key_pairs.sh b/messaging/config/cert_gen/01_gen_key_pairs.sh index b49e4e6..20dbb86 100644 --- a/messaging/config/cert_gen/01_gen_key_pairs.sh +++ b/messaging/config/cert_gen/01_gen_key_pairs.sh @@ -1,20 +1,2 @@ #/bin/bash -# Generate the key pair for the server -keytool \ - -keystore ${KEYSTORE_FILE} \ - -alias localhost \ - -validity ${VALIDITY} \ - -genkey \ - -keyalg RSA \ - -storetype pkcs12 - -# Generate the signing request for the generated key pair -keytool \ - -keystore ${KEYSTORE_FILE} \ - -certreq \ - -alias localhost \ - -keyalg RSA \ - -storetype pkcs12 \ - -file ${SERVER_CERT_SIGN_REQUEST} \ - -ext SAN=DNS:${SERVER_FQDN},IP:${SERVER_IPADDRESS} diff --git a/messaging/config/cert_gen/04_remove_password_from_client_key.sh b/messaging/config/cert_gen/04_remove_password_from_client_key.sh new file mode 100644 index 0000000..122a1f7 --- /dev/null +++ b/messaging/config/cert_gen/04_remove_password_from_client_key.sh @@ -0,0 +1,5 @@ +#/bin/bash + +openssl rsa \ + -in ${CLIENT_CERT_KEYPAIR} \ + -out ${CLIENT_CERT_KEYPAIR_PASSWORDLESS} diff --git a/messaging/config/cleanup.sh b/messaging/config/cleanup.sh new file mode 100644 index 0000000..f316537 --- /dev/null +++ b/messaging/config/cleanup.sh @@ -0,0 +1,4 @@ +rm ./ca/*.pem +rm ./ca/ca_database* +rm ./ca/ca_serial* +rm -rf ./certs diff --git a/messaging/config/env.sh b/messaging/config/env.sh index a5c8869..3a72ce0 100644 --- a/messaging/config/env.sh +++ b/messaging/config/env.sh @@ -8,8 +8,8 @@ export SERVER_IPADDRESS=127.0.0.1 export CLIENT_CERT_KEYPAIR=${PWD}/certs/client/client.key export CLIENT_CERT_SIGN_REQUEST=${PWD}/certs/client/client.csr export CLIENT_SIGNED_CERT=${PWD}/certs/client/client.signed.pem -export CLIENT_CERT_KEYPAIR_PASSWORDLESS=${PWD}/certs/client/client.passwordless.key export KEYSTORE_FILE=${PWD}/certs/keystore.jks +export KEYSTORE_PASS='ksp4ssword' export VALIDITY=3650 diff --git a/messaging/config/setup.sh b/messaging/config/setup.sh index 585325d..ce1115a 100644 --- a/messaging/config/setup.sh +++ b/messaging/config/setup.sh @@ -4,55 +4,117 @@ mkdir -p ./certs/server mkdir -p ./certs/client . env.sh -# export SERVER_CERT_SIGN_REQUEST=${PWD}/certs/server/localhost.csr -# export SERVER_FQDN=localhost -# export SERVER_IPADDRESS=127.0.0.1 -# -# export CLIENT_CERT_KEYPAIR=${PWD}/certs/client/client.key -# export CLIENT_CERT_SIGN_REQUEST=${PWD}/certs/client/client.csr -# export CLIENT_SIGNED_CERT=${PWD}/certs/client/client.signed.pem -# export CLIENT_CERT_KEYPAIR_PASSWORDLESS=${PWD}/certs/client/client.passwordless.key -# -# export KEYSTORE_FILE=${PWD}/certs/keystore.jks -# export VALIDITY=3650 +echo ${KEYSTORE_PASS} > ./certs/keystore.credentials.txt + +cd ca echo " " echo "--------------" -echo "Creating CA:" +echo " Creating CA Cert:" echo "--------------" +openssl \ + req -x509 \ + -config openssl-ca.cnf \ + -newkey rsa:4096 \ + -sha256 \ + -nodes \ + -out cacert.pem \ + -outform PEM -cd ca -. ./01_gen_ca.sh -. ./02_add_ca_to_keystore.sh -cd .. +# . ./01_gen_ca.sh +# . ./02_add_ca_to_keystore.sh +echo " " +echo "--------------" +echo " Importing CA Cert to Keystore file:" +echo " ${KEYSTORE_FILE}" +echo "--------------" +keytool \ + -keystore ${KEYSTORE_FILE} \ + -storepass ${KEYSTORE_PASS} \ + -alias KrakenDCARoot \ + -import \ + -file cacert.pem echo " " echo "--------------" -echo "Creating Server Certificate" +echo " Generating Secure Kafka Server Key: " echo "--------------" +keytool \ + -keystore ${KEYSTORE_FILE} \ + -storepass ${KEYSTORE_PASS} \ + -alias localhost \ + -validity ${VALIDITY} \ + -genkey \ + -keyalg RSA \ + -storetype pkcs12 -cd cert_gen -. ./01_gen_key_pairs.sh echo " " echo "--------------" -echo "Creating Client Certificate" +echo " Generating Secure Kafka Server SIGNING REQUEST: " echo "--------------" -. ./03_gen_client_keypair.sh -cd .. +keytool \ + -keystore ${KEYSTORE_FILE} \ + -storepass ${KEYSTORE_PASS} \ + -certreq \ + -alias localhost \ + -keyalg RSA \ + -storetype pkcs12 \ + -file ${SERVER_CERT_SIGN_REQUEST} \ + -ext SAN=DNS:${SERVER_FQDN},IP:${SERVER_IPADDRESS} echo " " echo "--------------" -echo "Signing Client Certificate" +echo " Generating Client Key Pair and SIGNING REQUEST: " echo "--------------" -cd ca -. ./03_sign_certificat_request.sh $CLIENT_CERT_SIGN_REQUEST -cd .. +openssl \ + req -newkey rsa:2048 \ + -subj '/CN=localhost/OU=TEST/O=KrakenD/L=Girona/ST=Girona/C=ES' \ + -config ./san.cnf \ + -nodes \ + -keyout ${CLIENT_CERT_KEYPAIR} \ + -out ${CLIENT_CERT_SIGN_REQUEST} echo " " echo "--------------" -echo "Remove password from client key" +echo " Checking CA DB exists: " echo "--------------" -cd cert_gen -. ./04_remove_password_from_client_key.sh +if [ ! -f "ca_database_index.txt" ]; then + touch ca_database_index.txt + echo "0001" > ca_serial.txt +fi + +echo " " +echo "--------------" +echo " Signing Server CERT: " +echo "--------------" +openssl \ + ca -config openssl-ca.cnf \ + -policy signing_policy \ + -extensions signing_req \ + -out ${SERVER_SIGNED_CERT} \ + -infiles ${SERVER_CERT_SIGN_REQUEST} + +echo " " +echo "--------------" +echo " Import Server CERT into keystore:" +echo "--------------" +keytool \ + -importcert \ + -keystore ${KEYSTORE_FILE} \ + -storepass ${KEYSTORE_PASS} \ + -alias localhost \ + -file ${SERVER_SIGNED_CERT} + +echo " " +echo "--------------" +echo " Signing Client CERT: " +echo "--------------" +openssl \ + ca -config openssl-ca.cnf \ + -policy signing_policy \ + -extensions signing_req \ + -out ${CLIENT_SIGNED_CERT} \ + -infiles ${CLIENT_CERT_SIGN_REQUEST} + cd .. From 0b930e92e4d8d60a0f5c22df6a733e4f70ad3e8d Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Tue, 17 Feb 2026 19:06:34 +0100 Subject: [PATCH 06/20] clean up setup scripts --- messaging/README.md | 15 +++++- messaging/clients/producers/kaf_payload.txt | 1 + messaging/config/README.md | 40 +++----------- messaging/config/ca/01_gen_ca.sh | 15 ------ messaging/config/ca/02_add_ca_to_keystore.sh | 53 ------------------- .../config/ca/03_sign_certificat_request.sh | 26 --------- messaging/config/ca/keystore.credentials.txt | 1 - messaging/config/ca/v3.ext | 6 --- messaging/config/cert_gen/01_gen_key_pairs.sh | 2 - .../cert_gen/02_gen_cert_signing_request.sh | 10 ---- .../config/cert_gen/03_gen_client_keypair.sh | 25 --------- .../04_remove_password_from_client_key.sh | 5 -- .../cert_gen/05_import_signed_server_cert.sh | 7 --- messaging/config/cert_gen/extfile.cnf | 1 - messaging/config/cert_gen/san.cnf | 16 ------ 15 files changed, 22 insertions(+), 201 deletions(-) create mode 100644 messaging/clients/producers/kaf_payload.txt delete mode 100755 messaging/config/ca/01_gen_ca.sh delete mode 100755 messaging/config/ca/02_add_ca_to_keystore.sh delete mode 100755 messaging/config/ca/03_sign_certificat_request.sh delete mode 100644 messaging/config/ca/keystore.credentials.txt delete mode 100644 messaging/config/ca/v3.ext delete mode 100644 messaging/config/cert_gen/01_gen_key_pairs.sh delete mode 100644 messaging/config/cert_gen/02_gen_cert_signing_request.sh delete mode 100755 messaging/config/cert_gen/03_gen_client_keypair.sh delete mode 100644 messaging/config/cert_gen/04_remove_password_from_client_key.sh delete mode 100644 messaging/config/cert_gen/05_import_signed_server_cert.sh delete mode 100644 messaging/config/cert_gen/extfile.cnf delete mode 100644 messaging/config/cert_gen/san.cnf diff --git a/messaging/README.md b/messaging/README.md index a85dcfd..5908456 100644 --- a/messaging/README.md +++ b/messaging/README.md @@ -2,7 +2,12 @@ ## Environment -To launch the test environment, just execute: +First of all, enter the `config` dir, and follow the +[README.md](./config/README.md) instructions to generate a self +signed certificate for the client and the `seckafkabroker` service, +to be able to use `mTLS` + +Once done that, launchthe test environment with: ``` docker compose up -d @@ -24,12 +29,20 @@ Along with services for telemetry: In order to produce messages you will need to have installed the `kaf` tool: [https://github.com/birdayz/kaf](https://github.com/birdayz/kaf). +Under the [`clients/producer`](./clients/producer) folder you will find +two scripts: +- [`kaf.sh`](./clients/producer/kaf.sh): to generate fake data for the + `stockprice` topic on the `kafkabroker` server. +- [`kaf_ssh.sh`](./clients/producer/kaf_ssl.sh): to generate fake data for the + `portfolioupdates` topic on the `seckafkaborker`. + ### Kaf to produce message with SSL TLS https://github.com/birdayz/kaf/blob/master/examples/ssl_keys.yaml + ## "Story Telling" The `kafkabroker` is a source of information for different market diff --git a/messaging/clients/producers/kaf_payload.txt b/messaging/clients/producers/kaf_payload.txt new file mode 100644 index 0000000..c529ff1 --- /dev/null +++ b/messaging/clients/producers/kaf_payload.txt @@ -0,0 +1 @@ +Name is Bart and Surname is Simpson diff --git a/messaging/config/README.md b/messaging/config/README.md index 9075341..5268b61 100644 --- a/messaging/config/README.md +++ b/messaging/config/README.md @@ -1,37 +1,11 @@ # Generate CA and certificates -To generate the example you should use these passwords: +To generate the example just run `bash ./setup.sh`, and fill the missing +fields for certificates (and accept signing and adding the certificates +to the keystore). -- for keystore: `ksp4ssword` -- for client certificate: `cl1entpass` - -You can select other passwords, but then you will need to change the -passwords in: - -- `certs/keystore.credentials.txt`: for the keystore -- `clients/producers/ka_fssl_client_cert_password`: for the client certificate - - -1. Edit the `env.sh` file, and check the environment vars - to know where the files will be placed. +You can edit the `env.sh` file to change settins if you want, however, +the only interesting variable to look at is the keystore password +(that is set to `ksp4ssword`). -2. Source the `env.sh` file - -```bash -source ./env.sh -``` - -1. Enter the `ca` dir, to generate the Certificate Authority - - `./01_gen_va.sh` - - `./02_add_ca_to_keystore.sh` - -2. Go to the `cert_gens` dir, and create a certificate, - with its signing request. - - - - `./03_sign_certificat_request.sh` - -**Edit the `certs/keystore.credentials.txt`** and change the placeholder -password `my_password` for the password used for the keystore. This -file is used by the dockerized secure kafka instance to read the -"secret" password for the keystore. +After genrating the self signed CA you can start the docker compose environment. diff --git a/messaging/config/ca/01_gen_ca.sh b/messaging/config/ca/01_gen_ca.sh deleted file mode 100755 index bdb4927..0000000 --- a/messaging/config/ca/01_gen_ca.sh +++ /dev/null @@ -1,15 +0,0 @@ -#/bin/bash - -# Create the "root" CA keypair / certificate -echo " " -echo "--------------" -echo " Creating CA certificate:" -echo "--------------" -openssl \ - req -x509 \ - -config openssl-ca.cnf \ - -newkey rsa:4096 \ - -sha256 \ - -nodes \ - -out cacert.pem \ - -outform PEM diff --git a/messaging/config/ca/02_add_ca_to_keystore.sh b/messaging/config/ca/02_add_ca_to_keystore.sh deleted file mode 100755 index d0cb3cc..0000000 --- a/messaging/config/ca/02_add_ca_to_keystore.sh +++ /dev/null @@ -1,53 +0,0 @@ -#/bin/bash - -# This add the CA to the server keystore (for kafka), -# when making requests, we either need to add the -# CA to the system valid CA's or if using java, adding -# it to its keystore too -echo " " -echo "--------------" -echo " Importing CA Cert to Keystore file:" -echo " ${KEYSTORE_FILE}" -echo "--------------" -keytool \ - -keystore ${KEYSTORE_FILE} \ - -alias KrakenDCARoot \ - -import \ - -file cacert.pem - -# Generate the key pair for the server -echo " " -echo "--------------" -echo " Generating Secure Kafka Server Key: " -echo "--------------" -keytool \ - -keystore ${KEYSTORE_FILE} \ - -alias localhost \ - -validity ${VALIDITY} \ - -genkey \ - -keyalg RSA \ - -storetype pkcs12 - -# Generate the signing request for the generated key pair -echo " " -echo "--------------" -echo " Generating Secure Kafka Server SIGNING REQUEST: " -echo "--------------" -keytool \ - -keystore ${KEYSTORE_FILE} \ - -certreq \ - -alias localhost \ - -keyalg RSA \ - -storetype pkcs12 \ - -file ${SERVER_CERT_SIGN_REQUEST} \ - -ext SAN=DNS:${SERVER_FQDN},IP:${SERVER_IPADDRESS} - - -echo " " -echo "--------------" -echo " Generating Client Key Pair and SIGNING REQUEST: " -echo "--------------" -openssl \ - req -newkey rsa:2048 \ - -keyout ${CLIENT_CERT_KEYPAIR} \ - -out ${CLIENT_CERT_SIGN_REQUEST} diff --git a/messaging/config/ca/03_sign_certificat_request.sh b/messaging/config/ca/03_sign_certificat_request.sh deleted file mode 100755 index 3339aae..0000000 --- a/messaging/config/ca/03_sign_certificat_request.sh +++ /dev/null @@ -1,26 +0,0 @@ -#/bin/bash - -if [ ! -f "ca_database_index.txt" ]; then - touch ca_database_index.txt - echo "0001" > ca_serial.txt -fi - -openssl \ - ca -config openssl-ca.cnf \ - -policy signing_policy \ - -extensions signing_req \ - -out ${CLIENT_SIGNED_CERT} \ - -infiles ${CLIENT_CERT_SIGN_REQUEST} - -openssl \ - ca -config openssl-ca.cnf \ - -policy signing_policy \ - -extensions signing_req \ - -out ${SERVER_SIGNED_CERT} \ - -infiles ${SERVER_CERT_SIGN_REQUEST} - -#subjectKeyIdentifier = hash -# -keystore ${KEYSTORE_FILE} \ -# -alias localhost \ -# -import \ -# -file $1 diff --git a/messaging/config/ca/keystore.credentials.txt b/messaging/config/ca/keystore.credentials.txt deleted file mode 100644 index 277c048..0000000 --- a/messaging/config/ca/keystore.credentials.txt +++ /dev/null @@ -1 +0,0 @@ -ksp4ssword diff --git a/messaging/config/ca/v3.ext b/messaging/config/ca/v3.ext deleted file mode 100644 index 0d6d5b4..0000000 --- a/messaging/config/ca/v3.ext +++ /dev/null @@ -1,6 +0,0 @@ -subjectKeyIdentifier = hash -authorityKeyIdentifier = keyid:always,issuer:always -basicConstraints = CA:FALSE -keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign -subjectAltName = DNS:localhost, DNS:seckafkabroker -issuerAltName = issuer:copy diff --git a/messaging/config/cert_gen/01_gen_key_pairs.sh b/messaging/config/cert_gen/01_gen_key_pairs.sh deleted file mode 100644 index 20dbb86..0000000 --- a/messaging/config/cert_gen/01_gen_key_pairs.sh +++ /dev/null @@ -1,2 +0,0 @@ -#/bin/bash - diff --git a/messaging/config/cert_gen/02_gen_cert_signing_request.sh b/messaging/config/cert_gen/02_gen_cert_signing_request.sh deleted file mode 100644 index 8c407b6..0000000 --- a/messaging/config/cert_gen/02_gen_cert_signing_request.sh +++ /dev/null @@ -1,10 +0,0 @@ -#/bin/bash - -# keytool \ -# -keystore ${KEYSTORE_FILE} \ -# -certreq \ -# -alias localhost \ -# -keyalg RSA \ -# -storetype pkcs12 \ -# -file ${SERVER_CERT_SIGN_REQUEST} \ -# -ext SAN=DNS:${SERVER_FQDN},IP:${SERVER_IPADDRESS} diff --git a/messaging/config/cert_gen/03_gen_client_keypair.sh b/messaging/config/cert_gen/03_gen_client_keypair.sh deleted file mode 100755 index 5bbb779..0000000 --- a/messaging/config/cert_gen/03_gen_client_keypair.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# openssl \ -# req -newkey rsa:2048 \ -# -keyout ${CLIENT_CERT_KEYPAIR} \ -# -out ${CLIENT_CERT_SIGN_REQUEST} -# -# -openssl \ - req -newkey rsa:2048 \ - -subj '/CN=localhost/OU=TEST/O=KrakenD/L=Girona/ST=Girona/C=ES' \ - -keyout ${CLIENT_CERT_KEYPAIR} \ - -out ${CLIENT_CERT_SIGN_REQUEST} \ - -nodes \ - -config ./san.cnf - -# export CERT_NAME='client' -# -# keytool -keystore $KEYSTORE_FILE \ -# -alias $CERT_NAME \ -# -certreq \ -# -file $CERT_NAME.csr \ -# -storepass ksp4ssword \ -# -keypass ksp4ssword \ -# -ext "SAN=dns:$CERT_NAME,dns:localhost" diff --git a/messaging/config/cert_gen/04_remove_password_from_client_key.sh b/messaging/config/cert_gen/04_remove_password_from_client_key.sh deleted file mode 100644 index 122a1f7..0000000 --- a/messaging/config/cert_gen/04_remove_password_from_client_key.sh +++ /dev/null @@ -1,5 +0,0 @@ -#/bin/bash - -openssl rsa \ - -in ${CLIENT_CERT_KEYPAIR} \ - -out ${CLIENT_CERT_KEYPAIR_PASSWORDLESS} diff --git a/messaging/config/cert_gen/05_import_signed_server_cert.sh b/messaging/config/cert_gen/05_import_signed_server_cert.sh deleted file mode 100644 index 450e225..0000000 --- a/messaging/config/cert_gen/05_import_signed_server_cert.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -keytool - -importcert \ - -keystore ${KEYSTORE_FILE} \ - -alias localhost \ - -file ${SERVER_SIGNED_CERT} diff --git a/messaging/config/cert_gen/extfile.cnf b/messaging/config/cert_gen/extfile.cnf deleted file mode 100644 index aafe5bd..0000000 --- a/messaging/config/cert_gen/extfile.cnf +++ /dev/null @@ -1 +0,0 @@ -subjectAltName=DNS:localhost diff --git a/messaging/config/cert_gen/san.cnf b/messaging/config/cert_gen/san.cnf deleted file mode 100644 index a081393..0000000 --- a/messaging/config/cert_gen/san.cnf +++ /dev/null @@ -1,16 +0,0 @@ -[ req ] -default_bits = 2048 -distinguished_name = req_distinguished_name -req_extensions = req_ext -prompt = no # <--- This is required to fix OpenSSL output bug -[ req_distinguished_name ] -countryName = ES -stateOrProvinceName = CA -localityName = Girona -organizationName = ExamplesKrakend -commonName = seckafkabroker -[ req_ext ] -subjectAltName = @alt_names -[alt_names] -DNS.1 = localhost -DNS.2 = seckafkabroker From 9c4e214fd6275c96303f09d7f93c2a9968504c18 Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Tue, 17 Feb 2026 23:05:34 +0100 Subject: [PATCH 07/20] checked that works on a clean setup --- messaging/clients/consumers/kaf_ssl_conf.yaml | 9 +++++++++ messaging/clients/consumers/seckaf_consume.sh | 6 ++++++ messaging/clients/producers/kaf_ssl.sh | 2 +- 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 messaging/clients/consumers/kaf_ssl_conf.yaml create mode 100755 messaging/clients/consumers/seckaf_consume.sh diff --git a/messaging/clients/consumers/kaf_ssl_conf.yaml b/messaging/clients/consumers/kaf_ssl_conf.yaml new file mode 100644 index 0000000..5ce2d91 --- /dev/null +++ b/messaging/clients/consumers/kaf_ssl_conf.yaml @@ -0,0 +1,9 @@ +clusters: + - name: seckafkabroker + brokers: + - localhost:49092 + TLS: + cafile: "../../config/ca/cacert.pem" + clientfile: "../../config/certs/client/client.signed.pem" + clientkeyfile: "../../config/certs/client/client.key" + insecure: false diff --git a/messaging/clients/consumers/seckaf_consume.sh b/messaging/clients/consumers/seckaf_consume.sh new file mode 100755 index 0000000..62e8d53 --- /dev/null +++ b/messaging/clients/consumers/seckaf_consume.sh @@ -0,0 +1,6 @@ +#/bin/bash +export KTOPIC=portfolioupdates +kaf consume \ + ${KTOPIC} \ + --config ./kaf_ssl_conf.yaml \ + --cluster seckafkabroker diff --git a/messaging/clients/producers/kaf_ssl.sh b/messaging/clients/producers/kaf_ssl.sh index be93d1f..c066038 100755 --- a/messaging/clients/producers/kaf_ssl.sh +++ b/messaging/clients/producers/kaf_ssl.sh @@ -1,7 +1,7 @@ #/bin/bash kaf produce \ - krafka \ + portfolioupdates \ --config ./kaf_ssl_conf.yaml \ --cluster seckafkabroker \ -H Content-Type:application/json \ From 4a8f950f80ed0870890868fccccef059ddfa59c6 Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Tue, 17 Feb 2026 23:10:33 +0100 Subject: [PATCH 08/20] move kaf clients to its own directory --- messaging/clients/consumers/kaf_ssl_conf.yaml | 9 --------- messaging/clients/{ => kaf}/consumers/kaf_consume.sh | 0 messaging/clients/kaf/consumers/kaf_ssl_conf.yaml | 9 +++++++++ messaging/clients/{ => kaf}/consumers/seckaf_consume.sh | 0 messaging/clients/{ => kaf}/producers/kaf.sh | 0 messaging/clients/{ => kaf}/producers/kaf_payload.json | 0 messaging/clients/{ => kaf}/producers/kaf_payload.txt | 0 messaging/clients/{ => kaf}/producers/kaf_ssl.sh | 0 messaging/clients/kaf/producers/kaf_ssl_conf.yaml | 9 +++++++++ messaging/clients/producers/kaf_ssl_conf.yaml | 9 --------- 10 files changed, 18 insertions(+), 18 deletions(-) delete mode 100644 messaging/clients/consumers/kaf_ssl_conf.yaml rename messaging/clients/{ => kaf}/consumers/kaf_consume.sh (100%) create mode 100644 messaging/clients/kaf/consumers/kaf_ssl_conf.yaml rename messaging/clients/{ => kaf}/consumers/seckaf_consume.sh (100%) rename messaging/clients/{ => kaf}/producers/kaf.sh (100%) rename messaging/clients/{ => kaf}/producers/kaf_payload.json (100%) rename messaging/clients/{ => kaf}/producers/kaf_payload.txt (100%) rename messaging/clients/{ => kaf}/producers/kaf_ssl.sh (100%) create mode 100644 messaging/clients/kaf/producers/kaf_ssl_conf.yaml delete mode 100644 messaging/clients/producers/kaf_ssl_conf.yaml diff --git a/messaging/clients/consumers/kaf_ssl_conf.yaml b/messaging/clients/consumers/kaf_ssl_conf.yaml deleted file mode 100644 index 5ce2d91..0000000 --- a/messaging/clients/consumers/kaf_ssl_conf.yaml +++ /dev/null @@ -1,9 +0,0 @@ -clusters: - - name: seckafkabroker - brokers: - - localhost:49092 - TLS: - cafile: "../../config/ca/cacert.pem" - clientfile: "../../config/certs/client/client.signed.pem" - clientkeyfile: "../../config/certs/client/client.key" - insecure: false diff --git a/messaging/clients/consumers/kaf_consume.sh b/messaging/clients/kaf/consumers/kaf_consume.sh similarity index 100% rename from messaging/clients/consumers/kaf_consume.sh rename to messaging/clients/kaf/consumers/kaf_consume.sh diff --git a/messaging/clients/kaf/consumers/kaf_ssl_conf.yaml b/messaging/clients/kaf/consumers/kaf_ssl_conf.yaml new file mode 100644 index 0000000..5092193 --- /dev/null +++ b/messaging/clients/kaf/consumers/kaf_ssl_conf.yaml @@ -0,0 +1,9 @@ +clusters: + - name: seckafkabroker + brokers: + - localhost:49092 + TLS: + cafile: "../../../config/ca/cacert.pem" + clientfile: "../../../config/certs/client/client.signed.pem" + clientkeyfile: "../../../config/certs/client/client.key" + insecure: false diff --git a/messaging/clients/consumers/seckaf_consume.sh b/messaging/clients/kaf/consumers/seckaf_consume.sh similarity index 100% rename from messaging/clients/consumers/seckaf_consume.sh rename to messaging/clients/kaf/consumers/seckaf_consume.sh diff --git a/messaging/clients/producers/kaf.sh b/messaging/clients/kaf/producers/kaf.sh similarity index 100% rename from messaging/clients/producers/kaf.sh rename to messaging/clients/kaf/producers/kaf.sh diff --git a/messaging/clients/producers/kaf_payload.json b/messaging/clients/kaf/producers/kaf_payload.json similarity index 100% rename from messaging/clients/producers/kaf_payload.json rename to messaging/clients/kaf/producers/kaf_payload.json diff --git a/messaging/clients/producers/kaf_payload.txt b/messaging/clients/kaf/producers/kaf_payload.txt similarity index 100% rename from messaging/clients/producers/kaf_payload.txt rename to messaging/clients/kaf/producers/kaf_payload.txt diff --git a/messaging/clients/producers/kaf_ssl.sh b/messaging/clients/kaf/producers/kaf_ssl.sh similarity index 100% rename from messaging/clients/producers/kaf_ssl.sh rename to messaging/clients/kaf/producers/kaf_ssl.sh diff --git a/messaging/clients/kaf/producers/kaf_ssl_conf.yaml b/messaging/clients/kaf/producers/kaf_ssl_conf.yaml new file mode 100644 index 0000000..5092193 --- /dev/null +++ b/messaging/clients/kaf/producers/kaf_ssl_conf.yaml @@ -0,0 +1,9 @@ +clusters: + - name: seckafkabroker + brokers: + - localhost:49092 + TLS: + cafile: "../../../config/ca/cacert.pem" + clientfile: "../../../config/certs/client/client.signed.pem" + clientkeyfile: "../../../config/certs/client/client.key" + insecure: false diff --git a/messaging/clients/producers/kaf_ssl_conf.yaml b/messaging/clients/producers/kaf_ssl_conf.yaml deleted file mode 100644 index 5ce2d91..0000000 --- a/messaging/clients/producers/kaf_ssl_conf.yaml +++ /dev/null @@ -1,9 +0,0 @@ -clusters: - - name: seckafkabroker - brokers: - - localhost:49092 - TLS: - cafile: "../../config/ca/cacert.pem" - clientfile: "../../config/certs/client/client.signed.pem" - clientkeyfile: "../../config/certs/client/client.key" - insecure: false From b97fc1677aeb910758f6b7731b06b7cf722d360e Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Wed, 18 Feb 2026 23:03:58 +0100 Subject: [PATCH 09/20] update readme for messaging examples and draft krakend config --- messaging/README.md | 146 +++++++++++++++++++++++++++++++--- messaging/config/krakend.json | 70 ++++++++++++---- 2 files changed, 190 insertions(+), 26 deletions(-) diff --git a/messaging/README.md b/messaging/README.md index 5908456..0ec38e9 100644 --- a/messaging/README.md +++ b/messaging/README.md @@ -2,7 +2,7 @@ ## Environment -First of all, enter the `config` dir, and follow the +First of all, enter the `config` dir, and follow the [README.md](./config/README.md) instructions to generate a self signed certificate for the client and the `seckafkabroker` service, to be able to use `mTLS` @@ -10,33 +10,33 @@ to be able to use `mTLS` Once done that, launchthe test environment with: ``` -docker compose up -d +docker compose up -d ``` It will bring up the following services: - `kafkabroker`: a single node kafka broker -- `seckafkabroker`: a single node - +- `seckafkabroker`: a single node + Along with services for telemetry: -- `grafana` +- `grafana` - `tempo` - `prometheus` [##](##) Producing messages -In order to produce messages you will need to have installed the +In order to produce messages you will need to have installed the `kaf` tool: [https://github.com/birdayz/kaf](https://github.com/birdayz/kaf). Under the [`clients/producer`](./clients/producer) folder you will find two scripts: -- [`kaf.sh`](./clients/producer/kaf.sh): to generate fake data for the +- [`kaf.sh`](./clients/producer/kaf.sh): to generate fake data for the `stockprice` topic on the `kafkabroker` server. -- [`kaf_ssh.sh`](./clients/producer/kaf_ssl.sh): to generate fake data for the +- [`kaf_ssh.sh`](./clients/producer/kaf_ssl.sh): to generate fake data for the `portfolioupdates` topic on the `seckafkaborker`. - + ### Kaf to produce message with SSL TLS @@ -45,7 +45,7 @@ https://github.com/birdayz/kaf/blob/master/examples/ssl_keys.yaml ## "Story Telling" -The `kafkabroker` is a source of information for different market +The `kafkabroker` is a source of information for different market prices updates, so, we create a couple of topics where we will publish some data: @@ -59,3 +59,129 @@ connect to it. - `orderplacement` - `portfolioupdates` +# Improved Kafka support + +## Async Agent + +The `async_agent` section in the main config contains an array of objects that +define the configuration of a given async agent. By using the `async/kafka` +namespace under the `extra_config` key, we select the Kafka driver. + +- `group_id`: the name of the consumer group to use +- `topics`: a list of topics to read from +- `connection`: details + + +#### The `connection` config + +- `brokers`: (required) the list of `[host]:[port]` addresses of the kafka brokers to + connecto to. +- `client_id`: (optional) a name to identify the client that is stablishing the + connection (nothing to do with the consumer group id). If not provided, + it defaults to Krakend with the version. +- `client_tls`: (optional) in order to authenticate using `mTLS`, or allow + https insecure connection, we have the same options available that + in regular [https backend requests](https://www.krakend.io/docs/enterprise/service-settings/tls/#client-tls-settings). +- `sasl`: (optional) to authenticate using [Simple Authentication and Security Layer](https://en.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer). + There are multiple SASL authentication methods but the current implementation + is **limited to plaintext (SASL/PLAIN) authentication**. + + - `user`: the username to use + - `password`: the password + - `azure_event_hub`: (optional) set to true if you want to use Azure + EventHub, that uses SASL V0 (instead of the default V1.x). + +- `dial_timeout`: (optional) specifies a duration (in string format: "100ms", "1s",..) + for the maximum time to dial to the brokers + +- `read_timeout`: (optional) specifies a duration (in string format: "100ms", "1s",..) + for the maximum time complete a read operation. + + +- `write_timeout`: (optional) specifies a duration (in string format: "100ms", "1s",..) + for the maximum time complete a write operation. + +- `keep_alive`: (optional) specifies a duration (in string format: "100ms", "1s",..) + to maintain a connection open while while not being used. + +- `rack_id`: (optional) a rack identifier for this client. This can be any string + value which indicates where this client is physically located. It + corresponds with the broker config 'broker.rack' + +- `channels_buffer_size`: (optional) The number of events to buffer in internal + and external channels. This permits the producer and consumer to continue + processing some messages in the background while user code is working, + greatly improving throughput. Defaults to 256. + +### The `consumer` config + +Since the `topic` to consume from is already defines at the general async +agent config level, here we define properties specific for the kafka driver. + + + +## Pub Sub + +### Publisher + +By adding the `backend/pubsub/publisher/kafka` key under a **backend**'s +`extra_config`, we override the regular configuration of the backend +to publish a message in a kafka queue. + +The `input_headers` of the backend will be converted to the message +metadata. + +The configuration has the following properties: + +- `success_status_code`: the return status code after a message has been + successfully published into a topic. **Warning**: is only possible + to specify a value of `2xx`, however, KrakenD only identifies a + successful response the one that return `200` or `201`. + +- `writer`: the definition of the topic we want to write to + - `connection`: this structure is the same that in + - `producer`: contains the specific configuration related to how to + configure + - `topic`: the topic name to write to + - `key_meta`: the meta field that will be used as key of the message + +#### `producer` object config + +- `max_message_bytes`: (int > 0, optional) The maximum permitted size of a message + (defaults to 1000000). Should be set equal to or smaller than + the broker's `message.max.bytes`. + +- `required_acks`: (string, optional) The level of acknowledgement reliability + needed from the broker (defaults to WaitForLocal). Equivalent to + the `request.required.acks` setting of the JVM producer. + - "no_response" -> NoResponse RequiredAcks = 0 + - "wait_for_local" -> waits for only the local commit to succeed before responding. + - "wait_for_all" -> waits for all in-sync replicas to commit before responding. + The minimum number of in-sync replicas is configured on the broker via + the `min.insync.replicas` configuration key. The string can also contain + a number > 0 to set a given number of expected acks. + +- `required_acks_timeout`: (duration, optional) The maximum duration + the broker will wait the receipt of the number of `required_acks` + (defaults to 10 seconds). This is only relevant when `required_acks` + is set to WaitForAll or a number > 1. Only supports + millisecond resolution, nanoseconds will be truncated. Equivalent to + the JVM producer's `request.timeout.ms` setting. + +- `compression_codec`: (string, optional) The type of compression to use on + messages (defaults to no compression). + Similar to `compression.codec` setting of the JVM producer. + [ `"none"`, `"gzip"`, `"snappy"`, `"lz4"`, `"zstd"` ] (defaults to `none`) +- `compression_level`: (int, optional) The level of compression to use on + messages. The meaning depends on the actual compression type used and + defaults to default compression level for the codec. +- `idempotent`: (boolean, optional) If enabled, the producer will ensure + that exactly one copy of each message is written. +- `retry_max`: (int, optional) The total number of times to retry sending a message (default 3). + Similar to the `message.send.max.retries` setting of the JVM producer. +- `retry_backoff`: (duration, optional) How long to wait for the cluster to + settle between retries (default 100ms). Similar to the `retry.backoff.ms` + setting of the JVM producer. + + +### Consumer diff --git a/messaging/config/krakend.json b/messaging/config/krakend.json index 9c022b2..781b27f 100644 --- a/messaging/config/krakend.json +++ b/messaging/config/krakend.json @@ -9,13 +9,13 @@ "async/kafka": { "group_id": "my_group_id", "topics": [ - "krafka" + "stockprice" ], "connection": { "brokers": [ "localhost:9092" ], - "client_id": "bartolo" + "client_id": "cid_stocksconsumer" }, "consumer": {} } @@ -33,13 +33,6 @@ "backend": [ { "url_pattern": "/__debug/hi" - }, - { - "extra_config": { - "backend/pubsub/publisher/kafka": { - - } - } } ] }, @@ -47,16 +40,27 @@ "name": "portfolioupdatesconsumer", "extra_config": { "async/kafka": { - "group_id": "my_group_id", + "group_id": "k_async_updates", "topics": [ - "krafka" + "portfolioupdates" ], "connection": { "brokers": [ - "shrimp.ln:9092", "localhost:49092" ], - "client_id": "bartolo" + "client_id": "cid_portfolioupdateconsumer", + "client_tls": { + "allow_insecure_connections": false, + "ca_certs": [ + "./config/ca/cacert.pem" + ], + "client_certs": [ + { + "certificate": "./config/certs/client/client.signed.pem", + "private_key": "./config/certs/client/client.key" + } + ] + } }, "consumer": {} } @@ -80,11 +84,45 @@ ], "endpoint": [ { - "path" + "path": "/portfolio/order", + "method": "POST", + "input_headers": [ + "X-Idempotency-Key", + "Some-Meta" + ], "backend": [ { - - "extra_config": + "url_pattern": "/_publisher/", + "extra_config": { + "backend/pubsub/publisher/kafka": { + "success_status_code": 201, + "writer": { + "topic": "orderplacement", + "key_meta": "X-Idempotency-Key", + "connection": { + "brokers": [ + "localhost:49092" + ], + "client_id": "krakend_async_agent", + "client_tls": { + "allow_insecure_connections": false, + "ca_certs": [ + "./config/ca/cacert.pem" + ], + "client_certs": [ + { + "certificate": "./config/certs/client/client.signed.pem", + "private_key": "./config/certs/client/client.key" + } + ] + } + }, + "producer": { + "idempotent": true + } + } + } + } } ] } From 2edce65d4c1c6d94db4a33fe6ff7b9554ac4f4a6 Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Thu, 19 Feb 2026 09:22:00 +0100 Subject: [PATCH 10/20] tested that publishing with mTLS works --- messaging/clients/curl/post_to_publisher.sh | 7 +++++++ messaging/clients/kaf/consumers/seckaf_consume.sh | 1 + messaging/config/krakend.json | 4 ++-- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100755 messaging/clients/curl/post_to_publisher.sh diff --git a/messaging/clients/curl/post_to_publisher.sh b/messaging/clients/curl/post_to_publisher.sh new file mode 100755 index 0000000..0292ef1 --- /dev/null +++ b/messaging/clients/curl/post_to_publisher.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +curl -X POST \ + -H 'X-Idempotency-Key: 0000001' \ + -H 'Some-Meta: avocados' \ + -d '{"foo": "bar"}' \ + http://localhost:8080/portfolio/order diff --git a/messaging/clients/kaf/consumers/seckaf_consume.sh b/messaging/clients/kaf/consumers/seckaf_consume.sh index 62e8d53..d6a41e3 100755 --- a/messaging/clients/kaf/consumers/seckaf_consume.sh +++ b/messaging/clients/kaf/consumers/seckaf_consume.sh @@ -1,5 +1,6 @@ #/bin/bash export KTOPIC=portfolioupdates +# export KTOPIC=orderplacement kaf consume \ ${KTOPIC} \ --config ./kaf_ssl_conf.yaml \ diff --git a/messaging/config/krakend.json b/messaging/config/krakend.json index 781b27f..1808273 100644 --- a/messaging/config/krakend.json +++ b/messaging/config/krakend.json @@ -82,9 +82,9 @@ ] } ], - "endpoint": [ + "endpoints": [ { - "path": "/portfolio/order", + "endpoint": "/portfolio/order", "method": "POST", "input_headers": [ "X-Idempotency-Key", From 667c82c417e38e559a88afccfa90f4596c0fb46b Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Thu, 19 Feb 2026 15:47:38 +0100 Subject: [PATCH 11/20] add example of endpoint that reads from a kafka queue --- messaging/README.md | 35 ++++++- messaging/clients/curl/get_portfolio_order.sh | 3 + messaging/clients/curl/post_to_publisher.sh | 3 +- .../clients/kaf/consumers/seckaf_consume.sh | 2 +- messaging/config/krakend.json | 96 ++++++++++++++++++- .../prometheus/prometheus.yml | 2 +- 6 files changed, 133 insertions(+), 8 deletions(-) create mode 100755 messaging/clients/curl/get_portfolio_order.sh diff --git a/messaging/README.md b/messaging/README.md index 0ec38e9..ab6e12b 100644 --- a/messaging/README.md +++ b/messaging/README.md @@ -154,9 +154,10 @@ The configuration has the following properties: - `required_acks`: (string, optional) The level of acknowledgement reliability needed from the broker (defaults to WaitForLocal). Equivalent to the `request.required.acks` setting of the JVM producer. - - "no_response" -> NoResponse RequiredAcks = 0 - - "wait_for_local" -> waits for only the local commit to succeed before responding. - - "wait_for_all" -> waits for all in-sync replicas to commit before responding. + - `"no_response"`: no requied acks (same as `"0"`) + - `"wait_for_local"`: waits for only the local commit to succeed before responding. + (same as `"1"`). + - `"wait_for_all"`: waits for all in-sync replicas to commit before responding. The minimum number of in-sync replicas is configured on the broker via the `min.insync.replicas` configuration key. The string can also contain a number > 0 to set a given number of expected acks. @@ -184,4 +185,30 @@ The configuration has the following properties: setting of the JVM producer. -### Consumer +### Consumer config + + +## OpenTelemery + +If OTEL is enabled these metrics will be reported by default for all messages +read (either in the async agent, or a subscriber backend) and written (by +a publisher backend). + +All of these matrics have these attributes set: + - `kind`: that helps identify the kind of queue systemthe message is + using (for example `kafka`). + - `topic`: the topic where the message is read from or going to be + writen to. + +- For reading: + `messaging.read.body.size`: histogram of body sizes in bytes (does not include the size of metadata) + `messaging.read.body.duration`: histogram of the duration taken to read a message + `messaging.read.ack.duration` + `messaging.read.failure.count` + +- For writing: + - `messaging.write.body.size`: histogram of body sizes in bytes (does not include the size of metadata) + - `messaging.write.body.duration`: histogram of duration taken to write a message + - `messaging.write.failure.count`: count of messages failed to be written + + diff --git a/messaging/clients/curl/get_portfolio_order.sh b/messaging/clients/curl/get_portfolio_order.sh new file mode 100755 index 0000000..8341bd6 --- /dev/null +++ b/messaging/clients/curl/get_portfolio_order.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +curl http://localhost:8080/portfolio/order diff --git a/messaging/clients/curl/post_to_publisher.sh b/messaging/clients/curl/post_to_publisher.sh index 0292ef1..35bbc86 100755 --- a/messaging/clients/curl/post_to_publisher.sh +++ b/messaging/clients/curl/post_to_publisher.sh @@ -1,7 +1,8 @@ #!/bin/bash +export IKEY=$(date +%Y%m%d_%H%M%S) curl -X POST \ - -H 'X-Idempotency-Key: 0000001' \ + -H "X-Idempotency-Key: $IKEY" \ -H 'Some-Meta: avocados' \ -d '{"foo": "bar"}' \ http://localhost:8080/portfolio/order diff --git a/messaging/clients/kaf/consumers/seckaf_consume.sh b/messaging/clients/kaf/consumers/seckaf_consume.sh index d6a41e3..99351cd 100755 --- a/messaging/clients/kaf/consumers/seckaf_consume.sh +++ b/messaging/clients/kaf/consumers/seckaf_consume.sh @@ -1,6 +1,6 @@ #/bin/bash export KTOPIC=portfolioupdates -# export KTOPIC=orderplacement +export KTOPIC=orderplacement kaf consume \ ${KTOPIC} \ --config ./kaf_ssl_conf.yaml \ diff --git a/messaging/config/krakend.json b/messaging/config/krakend.json index 1808273..9c4d09f 100644 --- a/messaging/config/krakend.json +++ b/messaging/config/krakend.json @@ -125,6 +125,100 @@ } } ] + }, + { + "endpoint": "/portfolio/order", + "method": "GET", + "backend": [ + { + "url_pattern": "/_consumer/", + "extra_config": { + "backend/pubsub/subscriber/kafka": { + "reader": { + "topics": ["orderplacement"], + "key_meta": "X-Idempotency-Key", + "group_id": "k_endpoint_read", + "connection": { + "brokers": [ + "localhost:49092" + ], + "client_id": "krakend_async_agent", + "client_tls": { + "allow_insecure_connections": false, + "ca_certs": [ + "./config/ca/cacert.pem" + ], + "client_certs": [ + { + "certificate": "./config/certs/client/client.signed.pem", + "private_key": "./config/certs/client/client.key" + } + ] + } + }, + "consumer": { + "isolation_level": "read_commited" + } + } + } + } + } + ] + } + ], + "extra_config": { + "telemetry/opentelemetry": { + "service_name": "krakend_prometheus_service", + "metric_reporting_period": 1, + "trace_sample_rate": 1, + "exporters": { + "otlp": [ + { + "disable_metrics": true, + "disable_traces": false, + "host": "localhost", + "name": "tempo", + "port": 54317, + "use_http": false + } + ], + "prometheus": [ + { + "name": "local_prometheus", + "port": 9099, + "process_metrics": true, + "go_metrics": true + } + ] + }, + "layers": { + "global": { + "disable_metrics": false, + "disable_propagation": false, + "disable_traces": false, + "report_headers": true + }, + "proxy": { + "disable_metrics": false, + "disable_traces": true, + "report_headers": true + }, + "backend": { + "metrics": { + "detailed_connection": true, + "disable_stage": false, + "read_payload": false, + "round_trip": false + }, + "traces": { + "detailed_connection": false, + "disable_stage": false, + "read_payload": false, + "report_headers": false, + "round_trip": false + } + } + } } - ] + } } diff --git a/messaging/config/telemetry-dashboards/prometheus/prometheus.yml b/messaging/config/telemetry-dashboards/prometheus/prometheus.yml index 737c9c2..0eb4318 100644 --- a/messaging/config/telemetry-dashboards/prometheus/prometheus.yml +++ b/messaging/config/telemetry-dashboards/prometheus/prometheus.yml @@ -13,6 +13,6 @@ scrape_configs: labels: app: krakend - targets: - - '192.168.1.12:9099' + - '192.168.1.22:9099' labels: app: lokrakend From 54a7e6d603dc66860d51851175f82e4c22b5ee18 Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Thu, 19 Feb 2026 22:09:59 +0100 Subject: [PATCH 12/20] use jaeger to look at traces --- messaging/README.md | 8 +- messaging/clients/curl/get_portfolio_order.sh | 2 +- ...o_publisher.sh => post_portfolio_order.sh} | 0 .../kaf/producers/generate_ticker_data.sh | 31 + messaging/clients/kaf/producers/kaf.sh | 4 - messaging/clients/kaf/producers/prices.txt | 5298 +++++++++++++++++ messaging/config/krakend.json | 4 +- .../grafana/datasources/prometheus-tempo.yml | 15 - .../telemetry-dashboards/tempo/tempo.yaml | 60 - messaging/docker-compose.yaml | 19 +- 10 files changed, 5344 insertions(+), 97 deletions(-) rename messaging/clients/curl/{post_to_publisher.sh => post_portfolio_order.sh} (100%) create mode 100755 messaging/clients/kaf/producers/generate_ticker_data.sh create mode 100644 messaging/clients/kaf/producers/prices.txt delete mode 100644 messaging/config/telemetry-dashboards/tempo/tempo.yaml diff --git a/messaging/README.md b/messaging/README.md index ab6e12b..9e91fad 100644 --- a/messaging/README.md +++ b/messaging/README.md @@ -201,10 +201,10 @@ All of these matrics have these attributes set: writen to. - For reading: - `messaging.read.body.size`: histogram of body sizes in bytes (does not include the size of metadata) - `messaging.read.body.duration`: histogram of the duration taken to read a message - `messaging.read.ack.duration` - `messaging.read.failure.count` + - `messaging.read.body.size`: histogram of body sizes in bytes (does not include the size of metadata) + - `messaging.read.body.duration`: histogram of the duration taken to read a message + - `messaging.read.ack.duration` + - `messaging.read.failure.count` - For writing: - `messaging.write.body.size`: histogram of body sizes in bytes (does not include the size of metadata) diff --git a/messaging/clients/curl/get_portfolio_order.sh b/messaging/clients/curl/get_portfolio_order.sh index 8341bd6..5c68836 100755 --- a/messaging/clients/curl/get_portfolio_order.sh +++ b/messaging/clients/curl/get_portfolio_order.sh @@ -1,3 +1,3 @@ #!/bin/bash -curl http://localhost:8080/portfolio/order +curl -v http://localhost:8080/portfolio/order diff --git a/messaging/clients/curl/post_to_publisher.sh b/messaging/clients/curl/post_portfolio_order.sh similarity index 100% rename from messaging/clients/curl/post_to_publisher.sh rename to messaging/clients/curl/post_portfolio_order.sh diff --git a/messaging/clients/kaf/producers/generate_ticker_data.sh b/messaging/clients/kaf/producers/generate_ticker_data.sh new file mode 100755 index 0000000..864b4cb --- /dev/null +++ b/messaging/clients/kaf/producers/generate_ticker_data.sh @@ -0,0 +1,31 @@ +#/bin/bash + +# this script produces fake ticker prices, using the `prices.txt` data +# with each line for each of the list of tickers +KTOPIC=stockprice +KADDRESS=shrimp.ln:9092 + +echo -e "Producing: $KKEY into '$KTOPIC' topic\n" + +SLEEP_PERIOD=1 +TICKERS=('NVDA', 'AAPL', 'AMZN') + +export idx=0 +while read -r line +do + export idx=$(expr $idx + 1) + export idx=$(expr $idx % 3) + + export PRICE=$line + export TICKER=${TICKERS[$idx]} + export KKEY=$(date +%Y%m%d_%H%M%S) + echo '{"ticker": "$TICKER", "price": $PRICE}' | envsubst | \ + kaf produce \ + ${KTOPIC} \ + -H Content-Type:application/json \ + -k ${KKEY} \ + -b ${KADDRESS} \ + -v \ + --input-mode full + sleep $SLEEP_PERIOD +done < './prices.txt' diff --git a/messaging/clients/kaf/producers/kaf.sh b/messaging/clients/kaf/producers/kaf.sh index 3412cd4..2265647 100755 --- a/messaging/clients/kaf/producers/kaf.sh +++ b/messaging/clients/kaf/producers/kaf.sh @@ -1,10 +1,6 @@ #/bin/bash - KTOPIC=stockprice KADDRESS=shrimp.ln:9092 - -echo -e "Producing: $KKEY into '$KTOPIC' topic\n" - SLEEP_PERIOD=5 PRICES=("309.28", "312.59", "315.7", "314.68", "311.9", "309.70", "319.00") diff --git a/messaging/clients/kaf/producers/prices.txt b/messaging/clients/kaf/producers/prices.txt new file mode 100644 index 0000000..f6481a8 --- /dev/null +++ b/messaging/clients/kaf/producers/prices.txt @@ -0,0 +1,5298 @@ +229.86619567871094 +233.5500030517578 +134.41000366210938 +229.36000061035156 +233.0800018310547 +133.47500610351562 +228.470703125 +231.88999938964844 +134.0290069580078 +228.47000122070312 +232.4600067138672 +134.3300018310547 +228.6999053955078 +233.0399932861328 +134.51499938964844 +227.69000244140625 +233.58999633789062 +134.51930236816406 +227.63999938964844 +233.1300048828125 +133.50999450683594 +233.33999633789062 +232.69119262695312 +133.94500732421875 +234.64999389648438 +231.3549041748047 +133.9698944091797 +234.57229614257812 +231.0 +132.7100067138672 +233.5449981689453 +231.8350067138672 +132.83230590820312 +233.3699951171875 +231.6699981689453 +133.03500366210938 +233.1107940673828 +232.32000732421875 +133.45140075683594 +232.77000427246094 +232.80999755859375 +132.8699951171875 +233.60499572753906 +229.85000610351562 +131.32020568847656 +235.07000732421875 +229.61000061035156 +130.61990356445312 +235.2899932861328 +230.76499938964844 +131.5749969482422 +235.47999572753906 +230.8800048828125 +130.97500610351562 +236.2100067138672 +230.7135009765625 +130.6898956298828 +236.46499633789062 +229.85499572753906 +131.52499389648438 +236.88999938964844 +228.89999389648438 +131.07989501953125 +237.8800048828125 +229.50379943847656 +134.5500030517578 +240.47999572753906 +228.6199951171875 +135.71499633789062 +240.34500122070312 +228.11500549316406 +135.00999450683594 +241.02999877929688 +228.1699981689453 +134.52499389648438 +241.7698974609375 +229.18280029296875 +135.12030029296875 +241.5449981689453 +229.63499450683594 +135.36129760742188 +241.52000427246094 +230.36000061035156 +135.25 +244.3800048828125 +227.7899932861328 +138.00010681152344 +243.94500732421875 +228.72999572753906 +136.5800018310547 +243.81520080566406 +228.29440307617188 +136.74009704589844 +243.99989318847656 +228.6699981689453 +137.3376007080078 +244.14999389648438 +228.93499755859375 +137.82000732421875 +244.10000610351562 +228.67999267578125 +138.36509704589844 +244.57000732421875 +228.67999267578125 +138.86000061035156 +244.0904998779297 +225.19140625 +140.66000366210938 +244.72999572753906 +224.95950317382812 +141.19500732421875 +244.42999267578125 +224.47500610351562 +139.96499633789062 +243.43499755859375 +224.10299682617188 +140.15139770507812 +243.05499267578125 +224.40269470214844 +139.5749969482422 +243.52000427246094 +224.58999633789062 +139.54989624023438 +244.47000122070312 +226.6699981689453 +139.41000366210938 +243.9398956298828 +224.00999450683594 +139.3300018310547 +244.3957061767578 +224.52000427246094 +139.94830322265625 +245.14999389648438 +224.62010192871094 +139.81500244140625 +244.7100067138672 +224.76499938964844 +140.639892578125 +244.9001007080078 +225.49000549316406 +140.44509887695312 +244.8800048828125 +226.0399932861328 +139.31939697265625 +244.8800048828125 +226.6699981689453 +139.24000549316406 +244.7449951171875 +223.4600067138672 +138.62060546875 +246.13059997558594 +222.61000061035156 +138.3000030517578 +246.3800048828125 +222.72000122070312 +139.5800018310547 +245.44500732421875 +222.35000610351562 +139.49000549316406 +245.2550048828125 +222.5399932861328 +139.80490112304688 +245.6199951171875 +222.69000244140625 +139.89999389648438 +245.86000061035156 +222.8699951171875 +140.1199951171875 +245.7899932861328 +219.4949951171875 +139.22999572753906 +247.1300048828125 +219.26499938964844 +139.19920349121094 +247.3699951171875 +217.6300048828125 +138.99110412597656 +247.44119262695312 +216.04969787597656 +137.1699981689453 +246.49000549316406 +214.9600067138672 +135.39669799804688 +245.8000030517578 +216.4398956298828 +135.10000610351562 +245.58999633789062 +216.49000549316406 +134.27000427246094 +247.85000610351562 +213.63510131835938 +132.92999267578125 +247.11019897460938 +214.19000244140625 +134.0399932861328 +247.7949981689453 +214.6999969482422 +134.60000610351562 +248.0500030517578 +214.97279357910156 +134.6199951171875 +248.66000366210938 +214.58709716796875 +132.72000122070312 +247.61000061035156 +214.2613067626953 +132.57000732421875 +247.22999572753906 +212.72999572753906 +130.10000610351562 +245.11000061035156 +207.11500549316406 +125.33999633789062 +246.52499389648438 +205.97000122070312 +126.19000244140625 +249.5800018310547 +207.80560302734375 +128.52499389648438 +247.97999572753906 +209.52999877929688 +128.3699951171875 +247.66810607910156 +210.75999450683594 +127.2699966430664 +247.72000122070312 +212.5399932861328 +128.81500244140625 +247.0500030517578 +212.8000030517578 +126.62999725341797 +243.47999572753906 +216.91000366210938 +130.4499969482422 +241.80999755859375 +216.8800048828125 +132.4149932861328 +243.1300048828125 +217.07000732421875 +132.55679321289062 +240.34030151367188 +214.67999267578125 +130.3751983642578 +239.82000732421875 +213.77000427246094 +129.88999938964844 +239.9499969482422 +213.72000122070312 +130.74000549316406 +240.30999755859375 +214.27000427246094 +131.52000427246094 +241.375 +214.41000366210938 +127.4800033569336 +241.52000427246094 +214.10870361328125 +126.27999877929688 +241.05799865722656 +213.65499877929688 +127.08000183105469 +241.89999389648438 +213.75 +127.61000061035156 +240.6300048828125 +211.08999633789062 +123.74500274658203 +238.9199981689453 +209.80999755859375 +121.91000366210938 +237.3800048828125 +208.82000732421875 +120.01000213623047 +237.59500122070312 +210.5742950439453 +122.7300033569336 +236.9199981689453 +209.3699951171875 +121.55999755859375 +237.60499572753906 +209.28500366210938 +122.18099975585938 +237.41000366210938 +208.5124053955078 +120.57990264892578 +237.9199981689453 +208.20249938964844 +120.47000122070312 +239.7100067138672 +209.77000427246094 +121.88500213623047 +241.83999633789062 +212.3000030517578 +125.05000305175781 +241.48500061035156 +210.6699981689453 +119.51000213623047 +241.19000244140625 +208.6699981689453 +119.22000122070312 +242.5399932861328 +209.2332000732422 +118.41000366210938 +240.96499633789062 +207.36000061035156 +115.23999786376953 +241.15179443359375 +207.24000549316406 +116.04499816894531 +236.8892059326172 +204.22999572753906 +113.16999816894531 +238.13999938964844 +205.05999755859375 +114.01000213623047 +238.39999389648438 +198.35000610351562 +111.61000061035156 +238.6300048828125 +199.40499877929688 +111.83000183105469 +238.1649932861328 +203.06500244140625 +116.01020050048828 +236.75 +202.89999389648438 +116.19999694824219 +238.2888946533203 +204.85000610351562 +117.7698974609375 +238.69000244140625 +206.1999969482422 +118.88999938964844 +236.07000732421875 +203.85000610351562 +115.95999908447266 +230.9199981689453 +205.19500732421875 +115.97000122070312 +230.6490020751953 +205.44500732421875 +115.40989685058594 +234.53990173339844 +207.34500122070312 +116.56310272216797 +234.67999267578125 +207.67999267578125 +116.2699966430664 +235.74749755859375 +208.64999389648438 +117.10980224609375 +236.0399932861328 +209.10040283203125 +117.66000366210938 +235.77000427246094 +208.4600067138672 +117.29000091552734 +236.47000122070312 +205.1199951171875 +114.84439849853516 +236.77999877929688 +203.8350067138672 +114.05999755859375 +234.4149932861328 +201.31500244140625 +111.6355972290039 +234.2949981689453 +200.8350067138672 +111.53500366210938 +233.69000244140625 +198.8000030517578 +110.52999877929688 +235.17999267578125 +199.52000427246094 +111.09719848632812 +235.32000732421875 +200.6999969482422 +110.58000183105469 +238.30999755859375 +199.4250030517578 +111.04000091552734 +239.02000427246094 +194.52499389648438 +109.69999694824219 +239.2899932861328 +193.9199981689453 +109.00499725341797 +240.41439819335938 +197.16009521484375 +110.50890350341797 +239.64999389648438 +200.3350067138672 +112.25 +238.8114013671875 +199.13999938964844 +112.6050033569336 +239.07000732421875 +199.27000427246094 +112.7300033569336 +228.5500030517578 +193.30999755859375 +108.06439971923828 +226.50869750976562 +194.33999633789062 +107.658203125 +225.47999572753906 +193.63999938964844 +108.08499908447266 +225.2100067138672 +193.18190002441406 +107.06009674072266 +226.5800018310547 +192.345703125 +106.76000213623047 +226.9761962890625 +193.0800018310547 +106.64990234375 +227.54100036621094 +194.66000366210938 +107.0199966430664 +222.52000427246094 +195.47500610351562 +106.30999755859375 +221.00320434570312 +197.11000061035156 +108.8949966430664 +218.5500030517578 +196.4499969482422 +108.81999969482422 +217.7550048828125 +193.5500030517578 +107.55999755859375 +220.5449981689453 +197.25999450683594 +110.43000030517578 +221.82020568847656 +198.34500122070312 +110.80860137939453 +220.72999572753906 +196.5 +108.63999938964844 +218.9499969482422 +198.58999633789062 +114.65010070800781 +216.44500732421875 +196.78500366210938 +114.51000213623047 +218.3603973388672 +199.52000427246094 +115.83499908447266 +218.18980407714844 +199.4333953857422 +116.11499786376953 +216.11000061035156 +199.22000122070312 +115.55500030517578 +215.639892578125 +199.01499938964844 +115.44999694824219 +216.94000244140625 +198.88999938964844 +115.73999786376953 +214.27999877929688 +195.71499633789062 +116.65499877929688 +214.0402069091797 +194.85000610351562 +116.08000183105469 +211.94000244140625 +193.7100067138672 +115.86090087890625 +211.15499877929688 +192.5399932861328 +115.26499938964844 +212.2899932861328 +193.89999389648438 +116.94999694824219 +210.6300048828125 +193.05999755859375 +116.00499725341797 +209.7100067138672 +193.91000366210938 +115.70999908447266 +210.3780975341797 +195.8350067138672 +119.52490234375 +211.92999267578125 +197.25999450683594 +120.93000030517578 +212.23069763183594 +197.41000366210938 +120.51499938964844 +212.31500244140625 +197.6699981689453 +120.54499816894531 +211.2449951171875 +197.0500030517578 +120.2750015258789 +212.90530395507812 +197.66250610351562 +120.58499908447266 +213.3800048828125 +197.94000244140625 +121.44999694824219 +213.22470092773438 +196.1649932861328 +119.53500366210938 +210.75469970703125 +195.4199981689453 +119.29499816894531 +211.1999969482422 +194.71299743652344 +118.36509704589844 +212.33030700683594 +196.1403045654297 +119.17489624023438 +214.4550018310547 +198.36000061035156 +120.5 +214.68499755859375 +197.47000122070312 +120.3644027709961 +214.19000244140625 +195.85000610351562 +119.4800033569336 +214.55140686035156 +190.82000732421875 +115.83999633789062 +213.3300018310547 +191.72000122070312 +116.75499725341797 +213.72000122070312 +192.24000549316406 +117.63999938964844 +212.2834014892578 +192.05999755859375 +117.15499877929688 +211.9949951171875 +192.56500244140625 +116.63870239257812 +212.34500122070312 +193.35499572753906 +116.13500213623047 +212.7899932861328 +192.91000366210938 +115.58000183105469 +217.14500427246094 +193.47999572753906 +116.98999786376953 +215.66900634765625 +193.4499969482422 +117.24500274658203 +215.3000030517578 +193.78500366210938 +118.0250015258789 +214.3800048828125 +192.21499633789062 +117.45860290527344 +214.27000427246094 +193.2449951171875 +118.53600311279297 +215.50990295410156 +194.33999633789062 +118.25 +215.3000030517578 +195.52000427246094 +117.5199966430664 +216.9904022216797 +197.80999755859375 +118.9000015258789 +216.0500030517578 +198.00999450683594 +119.63999938964844 +214.13999938964844 +195.0800018310547 +118.29000091552734 +213.22999572753906 +194.2595977783203 +117.88899993896484 +212.75999450683594 +193.7657012939453 +118.0791015625 +212.68350219726562 +194.14999389648438 +118.04499816894531 +214.14999389648438 +194.9499969482422 +118.47000122070312 +213.74000549316406 +195.15499877929688 +116.46939849853516 +213.44349670410156 +194.19119262695312 +116.29000091552734 +214.65499877929688 +195.35000610351562 +117.3499984741211 +214.6199951171875 +195.22500610351562 +117.06500244140625 +214.6699981689453 +195.375 +117.19110107421875 +215.30999755859375 +195.5802001953125 +116.78500366210938 +218.36000061035156 +196.22000122070312 +117.63500213623047 +219.77000427246094 +202.79359436035156 +120.4800033569336 +219.15750122070312 +201.80470275878906 +122.04000091552734 +219.0 +202.07850646972656 +121.75 +219.2899932861328 +202.15499877929688 +121.72879791259766 +219.75999450683594 +202.35000610351562 +121.81500244140625 +219.77000427246094 +203.0 +121.79499816894531 +220.42999267578125 +203.02999877929688 +121.2300033569336 +223.3699951171875 +205.13999938964844 +119.9800033569336 +223.52999877929688 +205.33999633789062 +120.2615966796875 +223.11000061035156 +204.75999450683594 +120.66020202636719 +222.80999755859375 +204.9199981689453 +120.23500061035156 +223.49000549316406 +205.4949951171875 +120.71510314941406 +223.4199981689453 +205.2100067138672 +120.69499969482422 +223.72999572753906 +205.6999969482422 +120.6449966430664 +224.07449340820312 +202.70010375976562 +115.11499786376953 +223.72000122070312 +203.31500244140625 +115.16500091552734 +223.6750030517578 +202.89999389648438 +114.03500366210938 +222.0800018310547 +201.7100067138672 +113.45999908447266 +221.8350067138672 +201.08999633789062 +113.6449966430664 +220.60000610351562 +200.47500610351562 +113.26499938964844 +221.39999389648438 +201.1479949951172 +113.69999694824219 +221.64999389648438 +202.8000030517578 +112.81500244140625 +222.8000946044922 +202.6300048828125 +113.55000305175781 +223.19500732421875 +202.5500030517578 +112.50499725341797 +223.10499572753906 +201.8000030517578 +111.69139862060547 +224.3699951171875 +202.3800048828125 +112.1449966430664 +224.7899932861328 +202.5500030517578 +112.66999816894531 +223.92999267578125 +201.36000061035156 +111.43000030517578 +219.91000366210938 +194.61000061035156 +109.27880096435547 +219.97999572753906 +194.82000732421875 +109.65499877929688 +218.69000244140625 +193.28500366210938 +109.58499908447266 +218.49000549316406 +192.3350067138672 +109.4749984741211 +219.0500030517578 +192.86990356445312 +110.01499938964844 +218.50999450683594 +192.60000610351562 +109.91000366210938 +217.8800048828125 +192.63999938964844 +109.63999938964844 +218.57000732421875 +184.72999572753906 +103.88999938964844 +219.1300048828125 +186.9792022705078 +105.1895980834961 +220.9199981689453 +188.7550048828125 +105.9800033569336 +219.8699951171875 +188.5959930419922 +105.72000122070312 +220.7949981689453 +189.8300018310547 +107.55010223388672 +221.22500610351562 +189.4250030517578 +107.23999786376953 +221.9949951171875 +190.2899932861328 +108.7699966430664 +221.5198974609375 +189.51499938964844 +107.12999725341797 +222.87989807128906 +192.22500610351562 +108.91089630126953 +222.52999877929688 +193.02000427246094 +109.4000015258789 +222.3385009765625 +192.13999938964844 +108.80120086669922 +221.5 +191.0 +107.71990203857422 +221.72999572753906 +191.3000030517578 +108.61129760742188 +223.13999938964844 +192.16000366210938 +110.1500015258789 +224.0399932861328 +192.17999267578125 +108.99859619140625 +224.47999572753906 +192.36500549316406 +110.25 +224.1300048828125 +195.77000427246094 +111.15239715576172 +224.72000122070312 +197.2353057861328 +111.23500061035156 +222.92999267578125 +194.61000061035156 +109.32499694824219 +223.66009521484375 +195.88999938964844 +109.6500015258789 +223.7899932861328 +195.9600067138672 +110.37999725341797 +205.63499450683594 +179.92999267578125 +105.1500015258789 +204.0500030517578 +180.11000061035156 +102.96990203857422 +206.05999755859375 +182.80999755859375 +103.66100311279297 +204.0050048828125 +181.052001953125 +103.0199966430664 +203.0 +179.77499389648438 +102.625 +202.1999969482422 +178.32000732421875 +102.66850280761719 +203.47000122070312 +178.5 +102.01000213623047 +195.27999877929688 +174.02000427246094 +94.60579681396484 +194.49000549316406 +176.28500366210938 +95.0999984741211 +192.80999755859375 +174.8699951171875 +93.82990264892578 +190.99000549316406 +174.77999877929688 +94.10009765625 +188.8800048828125 +174.4600067138672 +94.01000213623047 +190.22999572753906 +175.0850067138672 +95.16500091552734 +188.3800048828125 +170.97999572753906 +94.31999969482422 +182.39999389648438 +173.48500061035156 +93.61000061035156 +176.36000061035156 +170.88999938964844 +93.87999725341797 +178.13999938964844 +172.51499938964844 +95.87000274658203 +181.5399932861328 +174.77999877929688 +98.23290252685547 +180.3350067138672 +174.9600067138672 +97.41000366210938 +178.42129516601562 +173.8199005126953 +96.6500015258789 +181.58999633789062 +175.4499969482422 +97.70999908447266 +189.3300018310547 +182.20449829101562 +104.7300033569336 +184.08999633789062 +178.1510009765625 +102.05999755859375 +183.3300018310547 +177.16000366210938 +101.58499908447266 +175.02999877929688 +173.7274932861328 +98.77999877929688 +175.3300018310547 +173.9600067138672 +99.42990112304688 +172.88999938964844 +171.33999633789062 +96.31999969482422 +172.77000427246094 +171.08999633789062 +96.70999908447266 +178.41180419921875 +173.60499572753906 +99.97940063476562 +179.7550048828125 +171.68499755859375 +99.1688003540039 +179.58999633789062 +171.56500244140625 +99.44000244140625 +188.52499389648438 +181.27000427246094 +106.47000122070312 +190.8000030517578 +188.38999938964844 +112.02999877929688 +196.05999755859375 +189.33999633789062 +112.79000091552734 +198.85000610351562 +190.9499969482422 +114.25 +192.14500427246094 +184.59500122070312 +109.08000183105469 +188.8592071533203 +182.5800018310547 +107.8949966430664 +184.27000427246094 +176.49000549316406 +104.05000305175781 +188.00999450683594 +180.2550048828125 +106.47000122070312 +191.75999450683594 +182.8939971923828 +108.44400024414062 +189.98500061035156 +180.10000610351562 +106.44000244140625 +190.44000244140625 +181.0399932861328 +107.69999694824219 +189.92999267578125 +178.27999877929688 +107.69999694824219 +193.32000732421875 +179.52999877929688 +108.63999938964844 +195.80099487304688 +181.22250366210938 +109.44000244140625 +196.83070373535156 +182.88999938964844 +109.73999786376953 +197.5800018310547 +183.5749969482422 +110.3499984741211 +198.3419952392578 +184.47999572753906 +110.11000061035156 +198.02000427246094 +184.7899932861328 +110.69000244140625 +204.75 +184.97999572753906 +112.56700134277344 +203.60000610351562 +182.9499969482422 +111.33350372314453 +201.75 +180.57000732421875 +110.02999877929688 +203.86399841308594 +180.3800048828125 +110.44000244140625 +205.7899932861328 +181.67999267578125 +111.19999694824219 +205.7100067138672 +182.4199981689453 +111.3499984741211 +202.58999633789062 +182.08999633789062 +110.69999694824219 +200.8000030517578 +179.7906951904297 +111.01499938964844 +202.11500549316406 +180.9550018310547 +112.02999877929688 +203.0399932861328 +180.63999938964844 +113.26499938964844 +201.60440063476562 +179.1248016357422 +111.84010314941406 +201.76499938964844 +178.3531036376953 +112.12000274658203 +202.8000030517578 +178.98280334472656 +112.21009826660156 +202.1300048828125 +179.5800018310547 +112.0999984741211 +197.07000732421875 +176.64999389648438 +105.5199966430664 +198.35009765625 +178.67669677734375 +105.17510223388672 +196.91000366210938 +176.8300018310547 +103.91500091552734 +197.75999450683594 +176.69020080566406 +103.93499755859375 +194.55499267578125 +173.3000030517578 +102.18499755859375 +192.57000732421875 +171.6300048828125 +101.00499725341797 +194.3000030517578 +174.38999938964844 +104.5 +195.63999938964844 +172.9149932861328 +100.49500274658203 +196.0399932861328 +173.30999755859375 +100.39820098876953 +197.80499267578125 +173.83999633789062 +101.23500061035156 +196.6999969482422 +173.09500122070312 +100.8311996459961 +198.27999877929688 +174.1999969482422 +102.15630340576172 +197.24220275878906 +172.57000732421875 +101.21499633789062 +196.8699951171875 +172.58999633789062 +101.41000366210938 +192.1199951171875 +166.13999938964844 +95.83499908447266 +190.73500061035156 +166.82009887695312 +95.88999938964844 +191.1300048828125 +166.52999877929688 +95.80000305175781 +190.61399841308594 +165.63999938964844 +95.36859893798828 +190.82000732421875 +165.9290008544922 +95.58999633789062 +191.10499572753906 +165.85499572753906 +95.5999984741211 +193.08999633789062 +167.30999755859375 +96.80000305175781 +198.01499938964844 +171.88999938964844 +99.0199966430664 +198.8300018310547 +173.9199981689453 +98.8949966430664 +201.3800048828125 +176.58399963378906 +99.6500015258789 +198.5399932861328 +173.03500366210938 +98.1050033569336 +199.8917999267578 +173.0500946044922 +98.48500061035156 +198.6201934814453 +172.24989318847656 +97.70500183105469 +199.66000366210938 +173.1300048828125 +98.87999725341797 +206.80499267578125 +186.14999389648438 +104.18499755859375 +204.6300048828125 +183.2899932861328 +103.13700103759766 +204.11000061035156 +181.9613037109375 +103.36000061035156 +204.9499969482422 +181.9600067138672 +103.95999908447266 +204.48240661621094 +181.6300048828125 +103.71499633789062 +204.00999450683594 +180.85000610351562 +102.41999816894531 +204.36000061035156 +180.5399932861328 +102.53500366210938 +206.32000732421875 +183.72500610351562 +105.36869812011719 +205.9250030517578 +184.38319396972656 +105.34500122070312 +206.2899932861328 +185.02999877929688 +105.7489013671875 +206.90499877929688 +185.3000030517578 +106.29499816894531 +207.28900146484375 +185.81500244140625 +106.33470153808594 +207.09010314941406 +185.5399932861328 +105.7249984741211 +208.1999969482422 +186.47999572753906 +106.37999725341797 +206.63479614257812 +186.2100067138672 +107.54100036621094 +207.10000610351562 +187.11000061035156 +108.66000366210938 +208.63560485839844 +187.54730224609375 +109.4749984741211 +209.3701934814453 +188.66000366210938 +111.87000274658203 +208.50450134277344 +188.77149963378906 +110.83499908447266 +208.22000122070312 +189.38499450683594 +110.73500061035156 +209.22999572753906 +188.9499969482422 +110.95999908447266 +208.92999267578125 +188.42999267578125 +108.52519989013672 +207.9499969482422 +185.76150512695312 +106.5999984741211 +207.86000061035156 +185.0500030517578 +106.5509033203125 +208.13999938964844 +185.16000366210938 +106.27999877929688 +209.8699951171875 +186.2700958251953 +107.30000305175781 +210.5399932861328 +187.44000244140625 +108.19000244140625 +210.08999633789062 +187.6699981689453 +108.63999938964844 +210.9499969482422 +185.7949981689453 +108.52999877929688 +211.0399932861328 +186.2949981689453 +108.80979919433594 +210.48800659179688 +186.956298828125 +108.875 +210.36000061035156 +186.30999755859375 +108.73500061035156 +211.7227020263672 +187.94000244140625 +109.9801025390625 +211.3000030517578 +187.41000366210938 +109.4000015258789 +211.24000549316406 +187.39999389648438 +108.91999816894531 +209.32119750976562 +181.03790283203125 +105.98500061035156 +210.5449981689453 +181.72999572753906 +106.375 +210.58999633789062 +180.88499450683594 +106.05500030517578 +211.0800018310547 +181.69000244140625 +106.47000122070312 +210.71499633789062 +182.1300048828125 +107.19499969482422 +210.3446044921875 +181.7899932861328 +107.25499725341797 +212.49000549316406 +184.32000732421875 +108.7750015258789 +211.74000549316406 +189.19000244140625 +113.33000183105469 +212.8966064453125 +190.36000061035156 +114.32499694824219 +212.77999877929688 +189.55099487304688 +113.65180206298828 +212.50999450683594 +189.89010620117188 +113.5647964477539 +212.77999877929688 +189.94639587402344 +113.66999816894531 +212.94000244140625 +191.68499755859375 +113.0 +212.8300018310547 +189.8350067138672 +111.52999877929688 +206.72000122070312 +189.61000061035156 +113.90499877929688 +204.9008026123047 +189.32989501953125 +114.65010070800781 +205.0 +192.02859497070312 +114.74500274658203 +204.69900512695312 +190.8249969482422 +114.364501953125 +204.8800048828125 +190.94500732421875 +114.80000305175781 +204.75999450683594 +190.3699951171875 +114.47000122070312 +205.3000030517578 +190.0 +114.38999938964844 +198.77999877929688 +187.16940307617188 +113.24500274658203 +199.19960021972656 +187.625 +113.9198989868164 +199.9739990234375 +187.35000610351562 +113.78500366210938 +200.41000366210938 +187.4770050048828 +114.12999725341797 +200.9600067138672 +187.34759521484375 +114.37100219726562 +199.39999389648438 +186.8699951171875 +114.3740005493164 +198.77000427246094 +186.2100067138672 +113.80999755859375 +198.91000366210938 +186.64999389648438 +112.65499877929688 +199.03500366210938 +186.80999755859375 +113.06999969482422 +198.97999572753906 +186.40460205078125 +113.01789855957031 +199.4250030517578 +185.5449981689453 +112.91999816894531 +199.30499267578125 +185.9259033203125 +113.68000030517578 +199.70840454101562 +185.72999572753906 +114.2300033569336 +198.41000366210938 +184.97999572753906 +113.44499969482422 +199.22000122070312 +190.80999755859375 +113.48030090332031 +194.35069274902344 +187.98500061035156 +113.29499816894531 +194.8699951171875 +187.83770751953125 +113.67990112304688 +195.3000030517578 +188.993896484375 +113.94499969482422 +194.00999450683594 +187.74000549316406 +113.0000991821289 +194.32000732421875 +187.6199951171875 +113.23500061035156 +196.25 +188.77000427246094 +117.0199966430664 +195.82000732421875 +190.27000427246094 +117.23999786376953 +197.5399932861328 +191.66000366210938 +117.26000213623047 +199.24000549316406 +192.99839782714844 +118.04989624023438 +199.13999938964844 +193.76499938964844 +117.90489959716797 +198.63999938964844 +193.072998046875 +117.9749984741211 +199.55999755859375 +193.9199981689453 +118.54049682617188 +197.39999389648438 +192.13499450683594 +117.37000274658203 +198.360107421875 +192.25 +116.13159942626953 +198.42999267578125 +192.2100067138672 +116.37750244140625 +198.13499450683594 +192.42999267578125 +116.28500366210938 +198.13999938964844 +192.14999389648438 +116.43000030517578 +198.91000366210938 +192.33999633789062 +116.58000183105469 +198.77999877929688 +193.08999633789062 +116.7251968383789 +198.5399932861328 +193.0800018310547 +116.62069702148438 +209.16000366210938 +206.9550018310547 +120.86000061035156 +208.75999450683594 +206.86500549316406 +121.65139770507812 +208.72999572753906 +207.2801055908203 +122.37129974365234 +209.93499755859375 +208.24000549316406 +122.6614990234375 +210.77000427246094 +208.52000427246094 +122.73500061035156 +210.0500030517578 +207.97999572753906 +122.58499908447266 +210.8300018310547 +208.72000122070312 +122.98999786376953 +211.4499969482422 +214.48500061035156 +129.21499633789062 +211.38499450683594 +213.32000732421875 +129.8300018310547 +211.27999877929688 +213.94500732421875 +130.4600067138672 +211.7100067138672 +212.39999389648438 +130.8350067138672 +212.4600067138672 +212.05999755859375 +130.44500732421875 +213.22999572753906 +211.61830139160156 +130.21499633789062 +212.83999633789062 +211.19000244140625 +129.83999633789062 +213.2899932861328 +211.02000427246094 +132.66000366210938 +212.6199951171875 +211.75 +134.15499877929688 +212.2899932861328 +210.85000610351562 +134.97000122070312 +210.9600067138672 +209.8249969482422 +134.4600067138672 +211.3699951171875 +209.97900390625 +134.55999755859375 +211.3594970703125 +209.6300048828125 +134.88999938964844 +212.41000366210938 +210.24000549316406 +135.34710693359375 +210.27499389648438 +204.2100067138672 +133.27000427246094 +212.49639892578125 +204.470703125 +134.38499450683594 +211.64169311523438 +204.9385986328125 +135.2165985107422 +212.12010192871094 +205.52000427246094 +136.22000122070312 +210.6300048828125 +204.86000061035156 +135.36000061035156 +210.36000061035156 +204.2899932861328 +133.73500061035156 +211.45799255371094 +205.13999938964844 +134.89999389648438 +210.60000610351562 +205.52969360351562 +135.4250030517578 +210.0800018310547 +204.89999389648438 +134.86500549316406 +210.9550018310547 +205.3300018310547 +134.7949981689453 +211.11000061035156 +204.8596954345703 +135.82179260253906 +211.6199951171875 +204.97999572753906 +135.03500366210938 +211.72500610351562 +205.24000549316406 +135.08030700683594 +211.19000244140625 +205.55999755859375 +135.32000732421875 +206.61990356445312 +205.27000427246094 +135.28500366210938 +207.3300018310547 +205.3105926513672 +134.9250030517578 +208.48260498046875 +206.0050048828125 +135.22500610351562 +208.92999267578125 +206.26499938964844 +135.27499389648438 +208.02999877929688 +205.55499267578125 +135.0850067138672 +208.1273956298828 +205.55999755859375 +135.1199951171875 +208.75999450683594 +206.13999938964844 +135.49000549316406 +207.84500122070312 +203.83999633789062 +132.9499969482422 +207.63429260253906 +203.9091033935547 +133.77499389648438 +207.80999755859375 +203.87750244140625 +134.0845947265625 +207.3800048828125 +203.97000122070312 +134.10499572753906 +205.58999633789062 +203.30999755859375 +133.4499969482422 +206.27000427246094 +203.52000427246094 +133.81500244140625 +206.8699951171875 +204.1300048828125 +134.3800048828125 +205.80999755859375 +201.67860412597656 +134.0850067138672 +206.5800018310547 +202.9250030517578 +135.87579345703125 +205.63999938964844 +203.07000732421875 +137.0850067138672 +202.10000610351562 +200.82989501953125 +133.21499633789062 +202.3415069580078 +201.52000427246094 +132.84500122070312 +201.0301055908203 +200.62460327148438 +131.07870483398438 +202.05999755859375 +201.11599731445312 +131.72999572753906 +200.36000061035156 +202.50999450683594 +133.0399932861328 +200.9499969482422 +202.5865020751953 +132.8800048828125 +201.9499969482422 +203.4149932861328 +133.39500427246094 +201.88999938964844 +203.11000061035156 +133.51100158691406 +201.97000122070312 +204.1862030029297 +133.3350067138672 +202.61000061035156 +204.42979431152344 +133.918701171875 +201.3699951171875 +203.0800018310547 +132.78990173339844 +197.1699981689453 +201.03500366210938 +130.52999877929688 +196.5850067138672 +200.9199981689453 +130.97999572753906 +196.05020141601562 +201.24000549316406 +131.00999450683594 +196.6199951171875 +202.00900268554688 +131.9499969482422 +195.75 +201.86000061035156 +132.13499450683594 +195.46240234375 +201.375 +131.6239013671875 +195.33999633789062 +200.99000549316406 +131.30999755859375 +198.35000610351562 +205.02000427246094 +135.2917938232422 +199.36500549316406 +205.26010131835938 +135.2100067138672 +199.9949951171875 +205.8300018310547 +135.26199340820312 +199.95989990234375 +206.0449981689453 +135.60000610351562 +200.3699951171875 +205.8000030517578 +135.25160217285156 +200.29440307617188 +205.3300018310547 +135.13999938964844 +200.1999969482422 +205.9949951171875 +135.49000549316406 +200.75 +205.61000061035156 +135.26499938964844 +201.0449981689453 +205.63999938964844 +135.59190368652344 +201.10000610351562 +205.7050018310547 +135.9403076171875 +201.11000061035156 +205.55999755859375 +136.4499969482422 +200.85000610351562 +205.88999938964844 +136.6699981689453 +201.12860107421875 +205.5399932861328 +136.8300018310547 +200.4199981689453 +204.7949981689453 +134.8115997314453 +201.13999938964844 +207.10000610351562 +140.61929321289062 +200.74000549316406 +206.94000244140625 +141.66000366210938 +199.4199981689453 +205.97999572753906 +140.57020568847656 +199.97500610351562 +206.41000366210938 +139.875 +199.0399932861328 +204.52000427246094 +138.44419860839844 +199.13929748535156 +205.2899932861328 +138.91000366210938 +199.9499969482422 +205.68499755859375 +139.17999267578125 +199.24000549316406 +205.07000732421875 +137.36000061035156 +199.30999755859375 +204.6829071044922 +136.10499572753906 +197.71499633789062 +202.80999755859375 +133.58999633789062 +198.0850067138672 +202.6750030517578 +134.46229553222656 +199.1199951171875 +203.875 +134.77999877929688 +200.05059814453125 +204.89349365234375 +135.26499938964844 +200.66000366210938 +204.66000366210938 +134.83999633789062 +200.52999877929688 +204.32530212402344 +136.66009521484375 +200.7100067138672 +205.0800018310547 +136.45989990234375 +201.02999877929688 +205.22999572753906 +137.4075927734375 +200.860107421875 +205.7100067138672 +137.57000732421875 +201.45399475097656 +206.18739318847656 +138.03140258789062 +201.66000366210938 +206.83999633789062 +137.625 +201.8000030517578 +206.7100067138672 +137.3699951171875 +201.74000549316406 +207.68299865722656 +141.3000030517578 +202.5 +207.00999450683594 +141.8199005126953 +203.05499267578125 +207.47999572753906 +141.56500244140625 +203.31460571289062 +207.67999267578125 +141.61500549316406 +203.09170532226562 +206.34249877929688 +141.15980529785156 +203.17999267578125 +205.65249633789062 +141.4499969482422 +203.33999633789062 +205.77999877929688 +141.27000427246094 +205.13999938964844 +206.19000244140625 +140.98500061035156 +204.08999633789062 +205.97999572753906 +141.3249969482422 +202.8300018310547 +206.47000122070312 +140.51010131835938 +203.4149932861328 +207.56539916992188 +140.7899932861328 +203.1199951171875 +207.843505859375 +141.61880493164062 +203.19000244140625 +207.7449951171875 +141.6699981689453 +202.88699340820312 +207.24000549316406 +141.83009338378906 +202.4499969482422 +209.80990600585938 +141.97830200195312 +204.54379272460938 +212.55499267578125 +143.0388946533203 +203.13999938964844 +210.9499969482422 +143.0050048828125 +202.60009765625 +210.8800048828125 +141.57870483398438 +202.2104034423828 +209.59649658203125 +140.71499633789062 +200.72999572753906 +208.4949951171875 +139.59010314941406 +200.5500030517578 +207.85000610351562 +139.9499969482422 +203.66000366210938 +211.0399932861328 +141.64500427246094 +203.17990112304688 +211.28860473632812 +141.69500732421875 +202.625 +211.98500061035156 +142.25999450683594 +203.58999633789062 +212.31759643554688 +142.11500549316406 +204.98500061035156 +212.9134979248047 +142.36500549316406 +204.6999969482422 +212.88999938964844 +142.07179260253906 +203.92999267578125 +213.52000427246094 +141.69000244140625 +205.32000732421875 +214.6699981689453 +144.375 +204.52999877929688 +214.8699951171875 +143.1800994873047 +203.92880249023438 +215.7899932861328 +142.22500610351562 +200.72000122070312 +216.97000122070312 +142.77000427246094 +201.4600067138672 +217.1199951171875 +142.83990478515625 +201.25 +217.22000122070312 +142.77499389648438 +201.44000244140625 +216.9199981689453 +142.5500030517578 +202.8699951171875 +216.30999755859375 +142.8000030517578 +203.31500244140625 +215.6226043701172 +142.68699645996094 +202.53880310058594 +216.12879943847656 +143.11500549316406 +201.75999450683594 +216.2100067138672 +142.65499877929688 +201.6999969482422 +215.77999877929688 +143.11990356445312 +202.82000732421875 +216.94000244140625 +144.0 +202.75 +217.56900024414062 +143.9499969482422 +202.76010131835938 +217.59249877929688 +144.477294921875 +200.94000244140625 +216.7550048828125 +144.1501007080078 +200.2071075439453 +215.61000061035156 +143.37989807128906 +200.91000366210938 +215.80999755859375 +143.7100067138672 +199.23919677734375 +213.42999267578125 +142.4716033935547 +198.97999572753906 +213.2100067138672 +142.39999389648438 +198.85000610351562 +213.17100524902344 +142.83999633789062 +198.0666961669922 +212.8300018310547 +144.06500244140625 +198.14999389648438 +212.53030395507812 +144.45120239257812 +198.58999633789062 +213.37989807128906 +144.4499969482422 +199.25999450683594 +212.7050018310547 +144.3300018310547 +198.75 +213.02000427246094 +144.47500610351562 +198.88499450683594 +212.97000122070312 +144.7550048828125 +199.1999969482422 +213.24000549316406 +145.0 +196.15499877929688 +209.9149932861328 +141.1999969482422 +197.50999450683594 +212.7899932861328 +142.91650390625 +197.27000427246094 +213.72999572753906 +143.0749969482422 +197.27000427246094 +213.2458953857422 +142.65499877929688 +196.2779998779297 +212.4149932861328 +141.60000610351562 +196.22000122070312 +211.55999755859375 +141.5050048828125 +196.4499969482422 +212.10000610351562 +141.9600067138672 +198.42999267578125 +214.66000366210938 +144.47999572753906 +197.31500244140625 +216.02999877929688 +145.4698028564453 +197.0800018310547 +215.27999877929688 +145.9550018310547 +197.875 +215.8350067138672 +145.625 +197.9886932373047 +215.7550048828125 +145.22999572753906 +198.2449951171875 +216.3000030517578 +144.97000122070312 +198.3699951171875 +216.16000366210938 +144.6699981689453 +197.5800018310547 +215.97999572753906 +144.3986053466797 +197.5800018310547 +216.22999572753906 +144.50999450683594 +197.61500549316406 +216.80999755859375 +145.02000427246094 +196.52000427246094 +216.01010131835938 +144.8300018310547 +195.4600067138672 +214.9499969482422 +144.17999267578125 +195.83999633789062 +215.0800018310547 +144.27609252929688 +195.63999938964844 +214.80999755859375 +144.0399932861328 +197.06019592285156 +217.75840759277344 +145.22000122070312 +196.94000244140625 +216.6199951171875 +144.99000549316406 +196.9508056640625 +215.39990234375 +145.27999877929688 +196.05999755859375 +214.8350067138672 +145.13499450683594 +195.91000366210938 +215.1999969482422 +145.0500030517578 +195.63999938964844 +214.54010009765625 +144.17990112304688 +196.25 +212.55499267578125 +145.47000122070312 +198.67999267578125 +210.69000244140625 +144.625 +197.6699981689453 +210.08999633789062 +143.89990234375 +198.49000549316406 +209.91000366210938 +143.9550018310547 +198.32000732421875 +209.30999755859375 +143.48500061035156 +199.80999755859375 +209.98500061035156 +144.15499877929688 +199.92999267578125 +208.66000366210938 +143.78990173339844 +200.94000244140625 +209.60459899902344 +143.77999877929688 +201.37179565429688 +209.85000610351562 +143.6300048828125 +200.52999877929688 +208.87210083007812 +143.80999755859375 +200.1396026611328 +208.63999938964844 +142.92999267578125 +201.43899536132812 +209.5 +144.4058074951172 +201.69000244140625 +209.27499389648438 +143.90989685058594 +201.36019897460938 +209.0850067138672 +143.84500122070312 +201.5500030517578 +208.47999572753906 +144.1750030517578 +200.9822998046875 +212.67999267578125 +147.02000427246094 +201.3800048828125 +213.4199981689453 +146.90499877929688 +202.4499969482422 +213.40499877929688 +147.1649932861328 +201.9600067138672 +213.74319458007812 +147.19500732421875 +201.57000732421875 +213.5699005126953 +147.35009765625 +201.52999877929688 +213.55999755859375 +147.22850036621094 +200.2899932861328 +212.77000427246094 +147.8300018310547 +202.44000244140625 +213.8699951171875 +152.2050018310547 +202.10000610351562 +213.76980590820312 +152.0500030517578 +201.8699951171875 +212.88499450683594 +152.14129638671875 +201.13999938964844 +212.2100067138672 +153.89999389648438 +201.01539611816406 +211.60000610351562 +153.9322967529297 +201.15980529785156 +211.7667999267578 +153.75439453125 +201.60000610351562 +212.05999755859375 +154.30999755859375 +199.75 +213.32000732421875 +156.44859313964844 +199.69000244140625 +216.06500244140625 +154.95989990234375 +200.122802734375 +215.8699951171875 +155.625 +200.24000549316406 +216.1750030517578 +156.02999877929688 +200.97999572753906 +217.72999572753906 +156.0850067138672 +201.1750030517578 +216.95399475097656 +155.46429443359375 +200.94000244140625 +217.1300048828125 +155.0800018310547 +201.58009338378906 +220.00999450683594 +157.42010498046875 +201.38180541992188 +219.63499450683594 +157.91009521484375 +201.99000549316406 +219.6750030517578 +157.69000244140625 +202.0800018310547 +219.16000366210938 +157.48500061035156 +201.44000244140625 +217.4600067138672 +156.30499267578125 +201.125 +219.7050018310547 +156.47000122070312 +201.10000610351562 +223.2100067138672 +157.75 +201.00990295410156 +221.7899932861328 +157.10000610351562 +199.97000122070312 +221.40330505371094 +157.04989624023438 +200.3249969482422 +219.6649932861328 +157.7100067138672 +200.15499877929688 +219.86500549316406 +157.82550048828125 +200.69500732421875 +219.5800018310547 +157.57989501953125 +206.58560180664062 +219.80999755859375 +157.94500732421875 +205.1199951171875 +219.39999389648438 +157.8699951171875 +209.54010009765625 +219.5 +154.6300048828125 +207.9499969482422 +219.7270050048828 +152.88499450683594 +207.875 +219.2100067138672 +153.39500427246094 +208.08999633789062 +220.67739868164062 +154.27499389648438 +208.2100067138672 +220.8502960205078 +154.35169982910156 +208.19000244140625 +221.6999969482422 +153.72999572753906 +207.86000061035156 +220.4499969482422 +153.27999877929688 +212.3000030517578 +220.3000030517578 +156.08140563964844 +211.47500610351562 +220.6199951171875 +156.36500549316406 +210.92030334472656 +220.9300994873047 +157.093505859375 +210.81809997558594 +220.30499267578125 +157.2053985595703 +211.58999633789062 +220.2501983642578 +156.9550018310547 +211.94500732421875 +219.88999938964844 +156.8874969482422 +212.41000366210938 +219.8800048828125 +157.24000549316406 +213.73500061035156 +221.8300018310547 +160.6300048828125 +213.8800048828125 +222.7093048095703 +159.80499267578125 +214.10000610351562 +222.99960327148438 +159.37969970703125 +212.36000061035156 +223.89999389648438 +158.30999755859375 +212.0399932861328 +223.8699951171875 +158.27999877929688 +210.8365020751953 +223.05499267578125 +158.22000122070312 +209.67039489746094 +222.9499969482422 +158.3188018798828 +208.94039916992188 +222.50999450683594 +157.8249969482422 +209.4499969482422 +223.2100067138672 +158.3000946044922 +209.94000244140625 +223.47999572753906 +158.24000549316406 +209.27999877929688 +221.1300048828125 +159.07000732421875 +209.87069702148438 +219.77999877929688 +159.0800018310547 +210.8300018310547 +220.94000244140625 +159.72999572753906 +209.8350067138672 +220.55999755859375 +159.5850067138672 +209.94500732421875 +220.47000122070312 +159.5399932861328 +209.60499572753906 +219.69500732421875 +159.89500427246094 +210.03500366210938 +219.33999633789062 +160.00010681152344 +209.91000366210938 +222.88999938964844 +163.06869506835938 +207.80499267578125 +222.3699951171875 +163.35000610351562 +207.8000030517578 +222.39999389648438 +163.27000427246094 +208.9156036376953 +222.61329650878906 +162.56500244140625 +209.7324981689453 +222.41000366210938 +162.81500244140625 +209.88999938964844 +222.58070373535156 +162.85000610351562 +211.11000061035156 +222.47000122070312 +162.8300018310547 +212.00999450683594 +220.25999450683594 +162.41000366210938 +212.97999572753906 +221.63470458984375 +162.59669494628906 +212.0800018310547 +222.0850067138672 +163.2747039794922 +212.6199951171875 +222.2899932861328 +163.44769287109375 +212.60000610351562 +222.60000610351562 +163.72999572753906 +212.5749969482422 +222.05999755859375 +164.05999755859375 +212.4199981689453 +222.27999877929688 +164.10499572753906 +211.7899932861328 +224.37559509277344 +167.35989379882812 +210.8249969482422 +224.52999877929688 +166.4949951171875 +210.63499450683594 +225.26010131835938 +166.47869873046875 +211.1649932861328 +225.5800018310547 +166.1822967529297 +211.40499877929688 +226.10000610351562 +165.68150329589844 +211.16000366210938 +225.7899932861328 +165.09500122070312 +211.0749969482422 +224.99000549316406 +164.8800048828125 +208.02999877929688 +225.30560302734375 +163.72000122070312 +208.76499938964844 +225.8800048828125 +164.75469970703125 +208.8406982421875 +225.9949951171875 +164.97000122070312 +209.0 +225.7550048828125 +165.08009338378906 +209.0 +225.4499969482422 +164.82000732421875 +209.1999053955078 +225.33349609375 +164.40330505371094 +208.5399932861328 +225.6300048828125 +164.07000732421875 +210.1699981689453 +226.86000061035156 +171.57839965820312 +211.42999267578125 +226.67999267578125 +171.38499450683594 +210.67999267578125 +226.60000610351562 +171.38499450683594 +210.67269897460938 +225.9600067138672 +170.52499389648438 +211.375 +226.8350067138672 +170.91180419921875 +210.17999267578125 +226.2969970703125 +170.1999053955078 +209.00999450683594 +226.3000030517578 +170.5500030517578 +212.0850067138672 +225.27999877929688 +169.96490478515625 +210.1199951171875 +224.2050018310547 +170.37860107421875 +209.58999633789062 +223.36000061035156 +170.39500427246094 +210.35000610351562 +223.02999877929688 +170.9022979736328 +210.0384979248047 +223.1999969482422 +171.0050048828125 +210.3249969482422 +223.19000244140625 +170.77999877929688 +210.22000122070312 +223.1699981689453 +171.33999633789062 +209.9499969482422 +222.6204071044922 +172.92999267578125 +210.44000244140625 +223.75999450683594 +173.11500549316406 +211.38999938964844 +223.67999267578125 +173.860107421875 +210.9550018310547 +223.72000122070312 +173.72000122070312 +211.27999877929688 +223.94000244140625 +173.2989959716797 +210.9949951171875 +223.98500061035156 +173.28500366210938 +210.06100463867188 +223.99000549316406 +173.1114044189453 +209.9542999267578 +223.3699951171875 +172.08999633789062 +210.85000610351562 +224.52000427246094 +172.16009521484375 +211.00999450683594 +224.8699951171875 +172.15469360351562 +211.19000244140625 +225.9250030517578 +172.64999389648438 +210.93499755859375 +225.96499633789062 +172.4149932861328 +210.9499969482422 +225.9149932861328 +172.07000732421875 +211.22000122070312 +226.1199951171875 +172.38999938964844 +214.64500427246094 +227.94000244140625 +173.08009338378906 +213.47000122070312 +227.75 +172.6981964111328 +213.31959533691406 +228.4600067138672 +172.02940368652344 +213.67999267578125 +228.93089294433594 +172.55479431152344 +213.25999450683594 +229.35000610351562 +172.70480346679688 +212.5800018310547 +229.25990295410156 +171.9600067138672 +212.5399932861328 +229.30999755859375 +171.4600067138672 +213.2655029296875 +227.25 +166.0847930908203 +213.477294921875 +226.9600067138672 +167.86000061035156 +213.27999877929688 +226.44540405273438 +167.5509033203125 +214.41119384765625 +227.50999450683594 +168.26499938964844 +213.7100067138672 +227.22000122070312 +167.90029907226562 +214.18499755859375 +227.82000732421875 +167.88499450683594 +214.38999938964844 +227.52000427246094 +167.00999450683594 +212.9351043701172 +227.96499633789062 +169.1300048828125 +213.14999389648438 +227.38999938964844 +169.52330017089844 +213.5 +227.69000244140625 +168.6199951171875 +214.125 +228.2906951904297 +169.03500366210938 +214.40499877929688 +228.37899780273438 +170.65750122070312 +214.13999938964844 +228.10000610351562 +170.7100067138672 +214.30999755859375 +228.27000427246094 +170.8300018310547 +214.4600067138672 +230.85000610351562 +172.08999633789062 +215.25999450683594 +232.03500366210938 +172.67849731445312 +214.33999633789062 +232.00999450683594 +172.94500732421875 +214.7899932861328 +232.0050048828125 +173.43240356445312 +214.73500061035156 +232.24000549316406 +173.4550018310547 +214.80999755859375 +231.97999572753906 +173.6501007080078 +213.75999450683594 +232.24899291992188 +173.77999877929688 +214.58529663085938 +231.42140197753906 +174.46189880371094 +214.50999450683594 +232.125 +174.06809997558594 +214.3896026611328 +232.25 +174.3800048828125 +214.1699981689453 +231.7550048828125 +173.8843994140625 +213.88999938964844 +231.7899932861328 +173.64999389648438 +213.5 +231.74249267578125 +173.7949981689453 +213.9600067138672 +231.4499969482422 +173.49000549316406 +214.52000427246094 +233.47000122070312 +174.9250030517578 +214.43499755859375 +233.22000122070312 +174.92999267578125 +214.5399932861328 +232.75999450683594 +175.0299072265625 +213.64500427246094 +232.82000732421875 +175.2100067138672 +213.8000030517578 +232.9199981689453 +175.47500610351562 +213.42999267578125 +232.5854949951172 +176.15499877929688 +214.0399932861328 +232.80999755859375 +176.75 +213.0500030517578 +231.51499938964844 +178.13999938964844 +211.89999389648438 +230.69970703125 +175.85989379882812 +212.0 +231.1750030517578 +176.33999633789062 +212.1999969482422 +231.6999969482422 +176.19529724121094 +211.9600067138672 +231.28500366210938 +176.2050018310547 +211.88999938964844 +231.31149291992188 +175.8249969482422 +211.35000610351562 +231.0 +175.50999450683594 +210.61000061035156 +230.32000732421875 +178.4600067138672 +209.71499633789062 +230.13999938964844 +178.26519775390625 +210.1199951171875 +230.47999572753906 +178.80499267578125 +209.75650024414062 +230.35499572753906 +179.00669860839844 +209.85499572753906 +230.66000366210938 +179.55499267578125 +208.52000427246094 +229.49000549316406 +178.58999633789062 +209.02000427246094 +230.25999450683594 +179.2899932861328 +208.8424072265625 +232.5399932861328 +181.57000732421875 +208.28280639648438 +233.1699981689453 +179.889892578125 +208.95449829101562 +236.30999755859375 +181.3780059814453 +208.6649932861328 +234.4550018310547 +179.02000427246094 +208.61000061035156 +234.3699951171875 +177.36500549316406 +208.5699005126953 +233.4499969482422 +177.41969299316406 +207.61000061035156 +234.11000061035156 +177.85000610351562 +205.36000061035156 +219.09500122070312 +174.97500610351562 +203.44000244140625 +215.27499389648438 +174.77999877929688 +202.75 +216.05999755859375 +175.82000732421875 +201.9824981689453 +214.33999633789062 +173.10989379882812 +203.5500030517578 +214.24920654296875 +173.2799072265625 +203.19000244140625 +214.8800048828125 +173.75 +202.27000427246094 +214.80999755859375 +173.58999633789062 +206.75999450683594 +213.38999938964844 +177.9499969482422 +205.77000427246094 +211.75100708007812 +177.8498992919922 +203.93499755859375 +213.3509979248047 +178.9250030517578 +204.14999389648438 +212.7899932861328 +179.02999877929688 +203.42999267578125 +212.42739868164062 +179.27000427246094 +202.3249969482422 +212.44000244140625 +179.31390380859375 +203.33999633789062 +211.72000122070312 +179.97000122070312 +204.52999877929688 +214.69000244140625 +178.24000549316406 +204.6300048828125 +214.97999572753906 +176.88499450683594 +203.7100067138672 +215.3800048828125 +177.92999267578125 +204.03500366210938 +215.07000732421875 +178.02999877929688 +203.8699951171875 +214.14999389648438 +178.50999450683594 +203.3350067138672 +213.86000061035156 +178.77520751953125 +202.92999267578125 +213.80999755859375 +178.25999450683594 +210.75999450683594 +215.47000122070312 +178.0399932861328 +214.22500610351562 +217.50999450683594 +178.14999389648438 +214.49989318847656 +218.6750030517578 +178.23500061035156 +214.5399932861328 +220.80999755859375 +178.42999267578125 +214.6024932861328 +221.44500732421875 +179.22999572753906 +213.875 +221.1999969482422 +179.6649932861328 +213.25 +222.3300018310547 +179.41000366210938 +218.27000427246094 +224.6300048828125 +182.47999572753906 +219.62899780273438 +223.1903076171875 +181.52999877929688 +219.9149932861328 +222.78970336914062 +181.14999389648438 +218.7100067138672 +221.66990661621094 +179.97000122070312 +219.5 +221.39999389648438 +179.42010498046875 +219.3000946044922 +221.47999572753906 +179.47000122070312 +220.1300048828125 +223.1750030517578 +180.8699951171875 +222.7816925048828 +222.6197052001953 +182.19500732421875 +224.36000061035156 +222.8863067626953 +183.01499938964844 +228.1999969482422 +222.52999877929688 +182.90809631347656 +228.6750030517578 +222.4499969482422 +181.88499450683594 +229.2899932861328 +222.0850067138672 +182.61500549316406 +228.8300018310547 +222.44000244140625 +182.69500732421875 +229.3699951171875 +222.69000244140625 +182.75 +226.77499389648438 +221.52000427246094 +183.3455047607422 +227.47000122070312 +221.72000122070312 +183.1800994873047 +228.72999572753906 +222.11500549316406 +183.73500061035156 +228.10000610351562 +221.67999267578125 +183.23550415039062 +227.73500061035156 +220.72999572753906 +182.89999389648438 +227.64999389648438 +221.23500061035156 +182.16000366210938 +227.2050018310547 +221.3699951171875 +182.0850067138672 +228.57000732421875 +220.82000732421875 +180.92999267578125 +229.72999572753906 +221.08999633789062 +182.0146942138672 +229.77999877929688 +221.67999267578125 +182.27499389648438 +229.77499389648438 +222.1199951171875 +182.24000549316406 +229.57000732421875 +221.9698944091797 +183.06500244140625 +229.18299865722656 +221.86500549316406 +182.7845001220703 +229.64999389648438 +221.44000244140625 +183.10000610351562 +231.80999755859375 +222.60000610351562 +181.41099548339844 +232.2899932861328 +224.2010040283203 +180.13180541992188 +233.09500122070312 +224.32000732421875 +180.0500030517578 +232.4550018310547 +224.64999389648438 +180.99000549316406 +232.9250030517578 +224.08999633789062 +181.32989501953125 +233.5850067138672 +224.38499450683594 +181.26499938964844 +233.3300018310547 +224.55499267578125 +181.57000732421875 +232.2100067138672 +229.3350067138672 +182.5800018310547 +231.74020385742188 +228.6009979248047 +181.3800048828125 +232.00999450683594 +230.4550018310547 +181.14349365234375 +232.92730712890625 +232.14999389648438 +182.1649932861328 +232.72999572753906 +232.47000122070312 +181.52499389648438 +232.94500732421875 +231.3699951171875 +181.9600067138672 +232.8300018310547 +230.88999938964844 +182.0 +232.1699981689453 +232.2301025390625 +179.92010498046875 +231.07000732421875 +231.39999389648438 +179.5050048828125 +230.74000549316406 +230.00999450683594 +178.92999267578125 +230.57000732421875 +230.19000244140625 +179.70010375976562 +230.85000610351562 +230.41000366210938 +180.17999267578125 +231.36000061035156 +230.76499938964844 +179.97000122070312 +231.64999389648438 +231.05999755859375 +180.44000244140625 +230.66000366210938 +230.2899932861328 +182.67999267578125 +230.86000061035156 +230.16009521484375 +181.1519012451172 +230.67999267578125 +230.3000030517578 +181.7657928466797 +231.07000732421875 +230.8197021484375 +181.49920654296875 +231.14500427246094 +230.60000610351562 +181.76210021972656 +231.22500610351562 +231.3249969482422 +182.19500732421875 +230.8800048828125 +231.4199981689453 +181.97999572753906 +231.8300018310547 +228.76010131835938 +178.66490173339844 +231.32260131835938 +228.72000122070312 +178.27749633789062 +231.30990600585938 +228.55999755859375 +177.53990173339844 +230.625 +228.07000732421875 +176.69509887695312 +230.0500030517578 +227.99000549316406 +176.5749053955078 +230.18499755859375 +227.50999450683594 +176.33250427246094 +230.5399932861328 +228.02000427246094 +175.64999389648438 +226.7200927734375 +222.47500610351562 +170.30999755859375 +227.3350067138672 +223.3699951171875 +172.4250030517578 +227.1345977783203 +224.14999389648438 +174.0500030517578 +226.2949981689453 +224.2100067138672 +173.47500610351562 +225.99009704589844 +223.32000732421875 +172.8249969482422 +226.44500732421875 +223.97500610351562 +174.5800018310547 +225.9600067138672 +223.80999755859375 +175.38999938964844 +225.57989501953125 +222.3074951171875 +176.47500610351562 +225.1300048828125 +221.58999633789062 +174.96499633789062 +224.8300018310547 +221.25999450683594 +174.22569274902344 +224.1750030517578 +220.9499969482422 +174.26499938964844 +224.22999572753906 +221.6750030517578 +174.7449951171875 +224.8800048828125 +222.02000427246094 +174.80189514160156 +224.91000366210938 +221.9499969482422 +174.9709930419922 +227.9499969482422 +225.3625030517578 +176.32000732421875 +228.05999755859375 +227.7008056640625 +178.1300048828125 +227.16929626464844 +226.87139892578125 +177.00579833984375 +228.61000061035156 +227.55999755859375 +178.2949981689453 +227.8699951171875 +228.1300048828125 +178.11500549316406 +227.85000610351562 +228.8300018310547 +178.0601043701172 +227.75 +228.83999633789062 +178.02000427246094 +228.80999755859375 +228.52000427246094 +178.99000549316406 +228.56500244140625 +229.42010498046875 +181.22140502929688 +228.5399932861328 +228.26300048828125 +181.5240936279297 +228.43499755859375 +228.3350067138672 +181.0 +227.88499450683594 +228.50990295410156 +181.33990478515625 +227.59840393066406 +228.77000427246094 +181.03500366210938 +227.14999389648438 +227.89500427246094 +179.83999633789062 +226.5 +227.94500732421875 +180.97999572753906 +226.9615936279297 +228.03500366210938 +180.8800048828125 +227.57049560546875 +228.1804962158203 +181.68499755859375 +228.11160278320312 +227.85000610351562 +181.6199951171875 +228.3592071533203 +227.7989044189453 +181.81500244140625 +228.56820678710938 +228.2949981689453 +182.02549743652344 +229.3000030517578 +228.72000122070312 +181.6999969482422 +230.01499938964844 +229.15989685058594 +181.05999755859375 +229.5740966796875 +228.8249969482422 +181.58999633789062 +229.8699951171875 +228.69000244140625 +181.40420532226562 +229.83999633789062 +228.7050018310547 +181.93499755859375 +230.625 +229.10000610351562 +182.22259521484375 +230.13250732421875 +228.64999389648438 +181.6645965576172 +230.44000244140625 +229.0500030517578 +181.60000610351562 +230.41580200195312 +229.9969940185547 +177.69500732421875 +230.9499969482422 +231.7050018310547 +179.156494140625 +232.2899932861328 +232.42999267578125 +179.69000244140625 +233.0 +231.6790008544922 +179.91419982910156 +232.91920471191406 +232.02499389648438 +180.82969665527344 +232.97500610351562 +231.61000061035156 +180.0800018310547 +232.49000549316406 +231.55999755859375 +180.1999969482422 +232.80960083007812 +229.6649932861328 +175.06500244140625 +232.9600067138672 +228.92999267578125 +174.77499389648438 +232.5 +228.50999450683594 +174.14999389648438 +232.02999877929688 +228.4499969482422 +173.52000427246094 +232.17999267578125 +228.66000366210938 +173.55670166015625 +232.3542938232422 +228.93499755859375 +174.0399932861328 +232.27000427246094 +229.0500030517578 +174.27999877929688 +230.60000610351562 +224.9600067138672 +170.63360595703125 +227.82899475097656 +223.25 +169.05999755859375 +227.85000610351562 +223.74859619140625 +167.93499755859375 +228.41000366210938 +225.02999877929688 +169.23500061035156 +228.39999389648438 +225.16000366210938 +169.1981964111328 +228.94000244140625 +225.52000427246094 +170.2949981689453 +229.7100067138672 +225.3300018310547 +170.75 +236.8300018310547 +226.42999267578125 +171.35000610351562 +236.01100158691406 +225.61000061035156 +170.70590209960938 +236.49000549316406 +225.6407928466797 +171.52499389648438 +237.4272003173828 +225.625 +170.7834930419922 +236.91000366210938 +224.7100067138672 +169.36000061035156 +237.15499877929688 +224.8800048828125 +169.36500549316406 +238.49000549316406 +226.0 +170.6300048828125 +237.69000244140625 +233.1999969482422 +170.8614959716797 +237.39999389648438 +233.41000366210938 +170.8000030517578 +237.16000366210938 +233.51499938964844 +170.46420288085938 +238.0399932861328 +234.4199981689453 +170.4499969482422 +238.05999755859375 +235.1699981689453 +170.41220092773438 +238.70449829101562 +234.95010375976562 +170.90499877929688 +239.7100067138672 +235.69000244140625 +171.64999389648438 +239.28500366210938 +234.0762939453125 +165.13729858398438 +239.80499267578125 +233.03500366210938 +166.08999633789062 +238.77000427246094 +233.72000122070312 +166.36549377441406 +239.625 +232.97999572753906 +166.5850067138672 +239.1199951171875 +232.9499969482422 +166.76010131835938 +239.9250030517578 +232.87669372558594 +167.09500122070312 +239.6699981689453 +232.32000732421875 +167.0399932861328 +239.22999572753906 +235.36000061035156 +170.25999450683594 +238.6999969482422 +237.33009338378906 +169.9698944091797 +237.72999572753906 +236.60000610351562 +170.1649932861328 +237.80580139160156 +236.1342010498047 +169.86500549316406 +237.1649932861328 +236.50010681152344 +169.71499633789062 +237.11000061035156 +236.1699981689453 +169.14500427246094 +237.9199981689453 +235.86000061035156 +168.3699951171875 +236.3101043701172 +235.8800048828125 +168.0800018310547 +236.22500610351562 +236.17999267578125 +167.7550048828125 +236.0 +237.19000244140625 +168.7050018310547 +237.75 +237.76499938964844 +168.0850067138672 +234.52859497070312 +237.8000030517578 +168.2449951171875 +234.30999755859375 +238.23500061035156 +170.23989868164062 +234.35000610351562 +238.22999572753906 +170.7584991455078 +228.10800170898438 +233.86000061035156 +177.64999389648438 +227.0399932861328 +232.5850067138672 +178.61419677734375 +227.7386016845703 +231.7100067138672 +177.99000549316406 +226.80499267578125 +231.56460571289062 +178.00509643554688 +227.05999755859375 +231.1699981689453 +176.27499389648438 +226.18499755859375 +229.64199829101562 +176.72500610351562 +226.77999877929688 +230.36000061035156 +177.3300018310547 +228.94000244140625 +229.61000061035156 +177.2550048828125 +228.74000549316406 +230.94000244140625 +178.09500122070312 +228.61000061035156 +230.8498992919922 +177.55810546875 +229.47250366210938 +231.27000427246094 +177.0941925048828 +229.4600067138672 +231.22999572753906 +177.5749969482422 +229.85000610351562 +230.08270263671875 +177.1199951171875 +230.02000427246094 +229.9550018310547 +177.08999633789062 +234.07000732421875 +229.0500030517578 +177.77499389648438 +234.09500122070312 +229.0500030517578 +177.6750030517578 +233.9694061279297 +228.6750030517578 +178.11000061035156 +233.23500061035156 +228.52999877929688 +177.52499389648438 +233.5399932861328 +227.6300048828125 +177.4700927734375 +233.77549743652344 +227.7635955810547 +177.68499755859375 +234.05999755859375 +228.11000061035156 +177.7899932861328 +236.21499633789062 +231.06500244140625 +175.48899841308594 +236.82000732421875 +232.84970092773438 +177.02169799804688 +236.57000732421875 +231.95030212402344 +177.5850067138672 +235.75999450683594 +231.3350067138672 +177.27000427246094 +235.63999938964844 +231.5399932861328 +177.52499389648438 +235.97000122070312 +231.2624053955078 +177.19500732421875 +236.75999450683594 +231.44000244140625 +177.77999877929688 +239.52999877929688 +235.1898956298828 +176.31500244140625 +239.5928955078125 +235.64500427246094 +176.13999938964844 +239.19500732421875 +235.4149932861328 +175.26499938964844 +239.08560180664062 +234.8300018310547 +175.14999389648438 +238.92999267578125 +234.91000366210938 +174.77499389648438 +238.93829345703125 +234.41000366210938 +174.75 +238.13999938964844 +234.02000427246094 +174.8300018310547 +239.6300048828125 +230.41000366210938 +170.1199951171875 +239.47999572753906 +230.25999450683594 +170.40499877929688 +239.67430114746094 +230.96429443359375 +169.87840270996094 +239.52000427246094 +231.08999633789062 +170.23500061035156 +239.55999755859375 +231.37989807128906 +170.19580078125 +239.2628936767578 +231.41000366210938 +171.18850708007812 +238.97000122070312 +231.63999938964844 +170.2100067138672 +237.55999755859375 +231.85499572753906 +175.77490234375 +238.19000244140625 +232.8000030517578 +176.2550048828125 +237.94000244140625 +232.8800048828125 +176.25999450683594 +237.8800048828125 +232.63999938964844 +176.6199951171875 +237.8018035888672 +231.92999267578125 +176.55499267578125 +237.4499969482422 +231.68499755859375 +176.34500122070312 +237.85000610351562 +231.2100067138672 +176.27999877929688 +241.14999389648438 +233.39999389648438 +177.7050018310547 +242.27999877929688 +233.23019409179688 +176.3000030517578 +244.52000427246094 +233.61000061035156 +176.0677032470703 +245.24380493164062 +232.72000122070312 +175.88499450683594 +245.48849487304688 +232.44000244140625 +175.59500122070312 +245.61000061035156 +231.83999633789062 +176.31500244140625 +245.2899932861328 +231.60000610351562 +176.5019073486328 +252.67160034179688 +230.27999877929688 +175.4199981689453 +255.789794921875 +229.22500610351562 +175.46009826660156 +253.72000122070312 +228.52999877929688 +182.1999969482422 +254.5928955078125 +228.60499572753906 +182.9949951171875 +255.24000549316406 +228.1300048828125 +182.68499755859375 +255.7899932861328 +227.93499755859375 +183.26010131835938 +256.0899963378906 +227.6199951171875 +183.61000061035156 +256.6173095703125 +222.35000610351562 +180.6522979736328 +256.1000061035156 +223.2899932861328 +180.21499633789062 +255.72689819335938 +222.64999389648438 +179.485595703125 +254.6699981689453 +221.85000610351562 +178.69000244140625 +254.63999938964844 +221.02000427246094 +177.89500427246094 +254.16990661621094 +220.17649841308594 +178.10000610351562 +254.52999877929688 +220.74000549316406 +178.4499969482422 +252.6219940185547 +221.13999938964844 +178.4949951171875 +252.1199951171875 +221.139892578125 +178.3542022705078 +252.1649932861328 +220.88999938964844 +176.2449951171875 +251.49000549316406 +220.9199981689453 +177.12010192871094 +251.76499938964844 +220.0850067138672 +176.72000122070312 +251.38999938964844 +219.77999877929688 +177.05999755859375 +252.24000549316406 +220.2100067138672 +176.8800048828125 +254.0 +219.75990295410156 +177.14500427246094 +253.50010681152344 +219.8300018310547 +178.0301055908203 +252.53030395507812 +219.80999755859375 +179.26510620117188 +253.5 +218.8699951171875 +177.9799041748047 +254.55999755859375 +217.02999877929688 +177.20989990234375 +256.9599914550781 +217.47000122070312 +177.0749969482422 +256.94000244140625 +218.1300048828125 +177.67999267578125 +255.02000427246094 +218.9149932861328 +175.58999633789062 +255.9700927734375 +219.44000244140625 +176.7449951171875 +255.6649932861328 +219.97500610351562 +176.52999877929688 +256.5199890136719 +220.39999389648438 +177.15499877929688 +256.55499267578125 +220.19000244140625 +177.7342987060547 +255.64500427246094 +220.27000427246094 +177.68499755859375 +255.4600067138672 +219.8000030517578 +178.19000244140625 +254.2198944091797 +221.4300994873047 +183.375 +253.47000122070312 +220.67630004882812 +182.3249969482422 +253.66000366210938 +221.36129760742188 +182.02999877929688 +253.39999389648438 +221.77000427246094 +181.9031982421875 +254.57000732421875 +221.51499938964844 +181.7100067138672 +253.99000549316406 +221.74000549316406 +180.89500427246094 +254.35000610351562 +222.1699981689453 +181.82000732421875 +254.88619995117188 +218.91000366210938 +184.73989868164062 +254.22000122070312 +218.7449951171875 +186.30990600585938 +254.53509521484375 +219.3300018310547 +186.73500061035156 +253.73500061035156 +219.25999450683594 +185.625 +253.33999633789062 +219.24949645996094 +186.2725067138672 +253.9499969482422 +219.5968017578125 +185.88999938964844 +254.55999755859375 +219.55999755859375 +186.55999755859375 +256.1614074707031 +219.42999267578125 +186.65499877929688 +255.52450561523438 +219.2386932373047 +186.55999755859375 +256.1600036621094 +221.14999389648438 +186.60499572753906 +256.1404113769531 +221.5399932861328 +187.57000732421875 +256.4849853515625 +221.9600067138672 +187.48440551757812 +255.94000244140625 +220.875 +187.18350219726562 +255.41000366210938 +220.60000610351562 +187.1699981689453 +256.2200927734375 +220.69009399414062 +190.1049041748047 +257.1650085449219 +220.52999877929688 +189.85499572753906 +257.3450012207031 +222.2899932861328 +189.2100067138672 +257.4100036621094 +222.47000122070312 +189.11929321289062 +257.8800048828125 +221.97000122070312 +188.87510681152344 +257.510009765625 +221.9149932861328 +189.18499755859375 +257.1400146484375 +222.41000366210938 +188.9199981689453 +257.8500061035156 +223.49000549316406 +188.94369506835938 +258.510009765625 +222.5863037109375 +189.47390747070312 +258.5487060546875 +222.1800994873047 +188.7001953125 +258.30999755859375 +220.38999938964844 +187.17750549316406 +258.3699951171875 +220.21310424804688 +187.47500610351562 +257.9200134277344 +219.64999389648438 +187.3249969482422 +258.0150146484375 +219.49000549316406 +187.62100219726562 +257.7799987792969 +218.3300018310547 +185.5 +257.5513000488281 +219.10879516601562 +185.9698944091797 +257.1300048828125 +219.60499572753906 +186.92999267578125 +256.55999755859375 +220.24000549316406 +186.14990234375 +256.18499755859375 +221.1699981689453 +185.58999633789062 +256.510009765625 +220.67999267578125 +185.80999755859375 +256.6499938964844 +220.8800048828125 +185.52999877929688 +256.67999267578125 +221.4669952392578 +188.01510620117188 +256.3789978027344 +221.25 +185.24000549316406 +256.3384094238281 +221.07000732421875 +185.47000122070312 +255.88999938964844 +221.17999267578125 +185.90980529785156 +256.06988525390625 +221.13499450683594 +185.89500427246094 +256.0199890136719 +221.1999969482422 +185.5863037109375 +256.489990234375 +221.8000030517578 +184.9600067138672 +257.8399963378906 +223.18499755859375 +189.0449981689453 +258.0400085449219 +223.97999572753906 +188.27000427246094 +258.20001220703125 +225.02999877929688 +188.18499755859375 +257.92498779296875 +225.87669372558594 +188.14999389648438 +257.9150085449219 +226.61000061035156 +188.42239379882812 +258.25 +225.39999389648438 +188.58999633789062 +258.0299987792969 +225.1999969482422 +189.07000732421875 +254.97999572753906 +222.6999969482422 +194.05499267578125 +254.89500427246094 +223.10000610351562 +193.73500061035156 +253.84500122070312 +224.16299438476562 +193.85000610351562 +253.4575958251953 +223.86000061035156 +192.61000061035156 +253.55999755859375 +226.27000427246094 +192.875 +253.89999389648438 +227.0449981689453 +193.1199951171875 +253.97999572753906 +227.6199951171875 +192.2949981689453 +255.17999267578125 +226.54879760742188 +195.2550048828125 +249.41000366210938 +220.52000427246094 +188.5998992919922 +248.61000061035156 +220.16000366210938 +189.14999389648438 +247.80999755859375 +219.02000427246094 +188.16000366210938 +247.16000366210938 +218.61000061035156 +187.72000122070312 +246.1649932861328 +217.80299377441406 +186.39999389648438 +245.27999877929688 +216.17999267578125 +183.13999938964844 +246.37600708007812 +220.11000061035156 +188.49000549316406 +248.59030151367188 +220.16000366210938 +188.27499389648438 +249.17999267578125 +220.1699981689453 +188.43179321289062 +249.1042022705078 +220.0500030517578 +188.5500030517578 +249.1461944580078 +220.52499389648438 +187.9250030517578 +248.32000732421875 +220.1199951171875 +187.80259704589844 +247.58999633789062 +220.0 +188.32000732421875 +247.02000427246094 +216.4250030517578 +182.38499450683594 +246.21400451660156 +216.4949951171875 +181.5500030517578 +247.38999938964844 +218.3000030517578 +183.43629455566406 +247.79800415039062 +218.9199981689453 +183.22500610351562 +247.48500061035156 +217.55999755859375 +182.17999267578125 +248.4199981689453 +217.48500061035156 +181.89990234375 +247.85000610351562 +216.44000244140625 +180.07000732421875 +250.85000610351562 +216.1999969482422 +182.36990356445312 +249.85989379882812 +215.44000244140625 +181.71090698242188 +249.77499389648438 +215.42010498046875 +180.69020080566406 +248.0904998779297 +213.61500549316406 +178.17999267578125 +249.64700317382812 +214.8000030517578 +179.79490661621094 +249.9199981689453 +215.18099975585938 +180.16000366210938 +249.42999267578125 +215.6300048828125 +179.8699951171875 +247.50999450683594 +217.5749969482422 +182.41000366210938 +248.23500061035156 +216.75999450683594 +182.32139587402344 +247.72000122070312 +215.5 +180.96499633789062 +247.22000122070312 +215.52999877929688 +182.3300018310547 +245.66000366210938 +213.17999267578125 +180.33999633789062 +246.5500030517578 +214.07000732421875 +180.78500366210938 +247.42999267578125 +214.47000122070312 +181.81100463867188 +249.5601043701172 +213.9600067138672 +183.27999877929688 +248.47999572753906 +211.58999633789062 +180.8719940185547 +250.29649353027344 +213.05999755859375 +182.6300048828125 +250.81500244140625 +212.36639404296875 +182.36000061035156 +252.3000030517578 +213.68499755859375 +183.69000244140625 +252.75999450683594 +213.25999450683594 +183.7100067138672 +252.3000030517578 +213.0500030517578 +183.24000549316406 +259.5050048828125 +215.3300018310547 +184.94400024414062 +262.57000732421875 +214.64999389648438 +183.78500366210938 +263.489990234375 +214.8800048828125 +183.80999755859375 +263.1650085449219 +215.7100067138672 +183.8159942626953 +263.7300109863281 +215.72000122070312 +183.63409423828125 +263.4200134277344 +216.35499572753906 +182.95530700683594 +262.2300109863281 +216.47000122070312 +182.57000732421875 +263.4999084472656 +221.72000122070312 +180.18499755859375 +263.6619873046875 +221.97000122070312 +181.91000366210938 +263.1700134277344 +222.97500610351562 +182.49000549316406 +263.3265075683594 +221.5449981689453 +181.47999572753906 +263.44989013671875 +222.5843048095703 +181.22999572753906 +263.0849914550781 +222.4600067138672 +181.3350067138672 +262.8399963378906 +222.02999877929688 +181.13999938964844 +260.0498962402344 +217.4499969482422 +180.3968963623047 +258.4299011230469 +218.73989868164062 +178.87010192871094 +258.54998779296875 +218.97000122070312 +179.22000122070312 +256.69140625 +217.8000030517578 +177.69000244140625 +256.5509948730469 +217.30499267578125 +177.7050018310547 +257.510009765625 +218.27000427246094 +179.47669982910156 +258.42999267578125 +217.97000122070312 +180.2899932861328 +259.4798889160156 +219.88560485839844 +181.58009338378906 +259.3999938964844 +220.27139282226562 +181.9949951171875 +260.0400085449219 +220.07000732421875 +181.82000732421875 +259.8599853515625 +219.77499389648438 +181.78500366210938 +259.9700012207031 +220.60000610351562 +182.7100067138672 +259.8999938964844 +220.96499633789062 +182.78500366210938 +259.5799865722656 +221.08999633789062 +182.1999969482422 +260.94140625 +223.47999572753906 +184.61500549316406 +263.2799987792969 +223.7899932861328 +185.19000244140625 +263.5799865722656 +224.76519775390625 +185.08999633789062 +263.6099853515625 +224.83999633789062 +185.0 +264.0199890136719 +224.85000610351562 +185.27499389648438 +263.5 +224.3350067138672 +186.91000366210938 +262.739990234375 +224.25999450683594 +186.25999450683594 +265.7300109863281 +227.35279846191406 +189.8800048828125 +265.7099914550781 +226.93350219726562 +190.92449951171875 +265.92999267578125 +227.30999755859375 +190.9250030517578 +265.6199951171875 +227.3800048828125 +191.3341064453125 +265.5950012207031 +227.82000732421875 +190.55999755859375 +267.2749938964844 +226.72999572753906 +190.7252960205078 +268.739990234375 +226.97999572753906 +191.42999267578125 +268.6499938964844 +226.52000427246094 +192.8249969482422 +268.69720458984375 +227.5500030517578 +192.80499267578125 +268.9949951171875 +229.11000061035156 +193.70010375976562 +269.4949951171875 +230.69000244140625 +194.58929443359375 +269.0902099609375 +230.05239868164062 +199.31199645996094 +269.20001220703125 +230.368896484375 +202.01499938964844 +269.0299987792969 +229.24000549316406 +201.02999877929688 +270.4200134277344 +229.1300048828125 +210.61000061035156 +267.6300048828125 +230.53500366210938 +208.7949981689453 +268.6199951171875 +231.3679962158203 +206.58999633789062 +269.93011474609375 +230.3721923828125 +206.78900146484375 +270.80999755859375 +229.69000244140625 +206.94000244140625 +268.30999755859375 +228.86000061035156 +207.0399932861328 +269.7300109863281 +230.33999633789062 +207.0500030517578 +269.0899963378906 +226.67999267578125 +202.20590209960938 +270.7900085449219 +227.9600067138672 +203.0749969482422 +272.010009765625 +226.1199951171875 +203.42990112304688 +271.95001220703125 +225.4199981689453 +203.05499267578125 +271.75 +225.08999633789062 +203.5904998779297 +271.3399963378906 +224.39100646972656 +202.54989624023438 +271.2900085449219 +222.77000427246094 +202.8000030517578 +270.3800048828125 +246.5500030517578 +205.47999572753906 +271.29998779296875 +247.7899932861328 +205.2801055908203 +272.43499755859375 +245.8000030517578 +203.98500061035156 +270.3487854003906 +246.02499389648438 +202.8365020751953 +271.80999755859375 +247.60000610351562 +204.27000427246094 +272.1050109863281 +246.85220336914062 +204.41000366210938 +270.25 +244.22000122070312 +202.41000366210938 +267.6300048828125 +255.33999633789062 +207.7949981689453 +266.6400146484375 +255.4600067138672 +207.9149932861328 +267.5350036621094 +256.01031494140625 +209.4199981689453 +267.6780090332031 +256.510009765625 +210.95989990234375 +267.30999755859375 +255.06500244140625 +207.7050018310547 +267.6199951171875 +254.8699951171875 +207.0749969482422 +269.05999755859375 +254.05999755859375 +207.0 +268.42999267578125 +253.38999938964844 +201.6595001220703 +270.6099853515625 +252.44009399414062 +201.85000610351562 +270.010009765625 +250.9550018310547 +200.97500610351562 +270.6383972167969 +249.8699951171875 +199.82510375976562 +270.5104064941406 +249.75 +200.19000244140625 +270.09051513671875 +249.42999267578125 +199.88499450683594 +270.2099914550781 +249.42999267578125 +198.5399932861328 +269.0101013183594 +248.60000610351562 +200.6300048828125 +270.2900085449219 +249.10000610351562 +202.33999633789062 +269.9700012207031 +249.80999755859375 +201.27000427246094 +270.1199951171875 +249.97000122070312 +200.9499969482422 +270.42999267578125 +249.12060546875 +201.03500366210938 +269.6000061035156 +248.44000244140625 +199.5301055908203 +270.1099853515625 +250.24000549316406 +195.1699981689453 +272.82000732421875 +247.1595001220703 +193.06500244140625 +272.1814880371094 +243.66000366210938 +190.6999969482422 +271.42498779296875 +243.94000244140625 +186.82000732421875 +271.3500061035156 +244.11000061035156 +189.20640563964844 +271.9901123046875 +245.40989685058594 +190.5 +271.2099914550781 +244.1199951171875 +189.82000732421875 +269.6600036621094 +243.0800018310547 +188.1699981689453 +271.5799865722656 +240.9499969482422 +182.42799377441406 +269.5299987792969 +240.00999450683594 +180.11219787597656 +269.1099853515625 +239.75999450683594 +182.05999755859375 +268.45001220703125 +240.5500030517578 +184.44000244140625 +267.25 +241.48989868164062 +184.98500061035156 +267.7598876953125 +243.3699951171875 +186.13499450683594 +268.4200134277344 +244.41000366210938 +188.2299041748047 +271.85699462890625 +248.02999877929688 +196.6199951171875 +269.06640625 +246.3800048828125 +194.12179565429688 +269.0799865722656 +247.10499572753906 +195.8656005859375 +269.7300109863281 +248.6300048828125 +196.71180725097656 +269.6600036621094 +248.7698974609375 +197.9199981689453 +269.11859130859375 +248.27000427246094 +198.74000549316406 +269.3599853515625 +248.41000366210938 +199.0399932861328 +274.1000061035156 +248.46780395507812 +192.52999877929688 +272.5 +247.5800018310547 +192.375 +273.31500244140625 +248.26829528808594 +192.4199981689453 +274.4800109863281 +249.3260040283203 +193.64999389648438 +275.32000732421875 +249.3699951171875 +193.97509765625 +275.25 +248.8800048828125 +194.10499572753906 +275.29998779296875 +249.13999938964844 +193.22999572753906 +272.94000244140625 +245.9250030517578 +192.69000244140625 +274.6000061035156 +245.3000030517578 +193.10000610351562 +274.3900146484375 +245.1699981689453 +192.0500030517578 +274.9800109863281 +245.44869995117188 +192.6300048828125 +274.45001220703125 +245.08749389648438 +192.12989807128906 +274.04998779296875 +245.16000366210938 +192.41000366210938 +273.4700012207031 +244.25 +193.85000610351562 +273.7099914550781 +242.53900146484375 +188.09609985351562 +274.037109375 +239.789794921875 +186.2899932861328 +272.8599853515625 +239.84500122070312 +186.92990112304688 +272.5700988769531 +238.07339477539062 +184.86500549316406 +273.5299987792969 +239.0500030517578 +186.00999450683594 +273.03961181640625 +238.3990020751953 +185.9499969482422 +273.0400085449219 +237.5800018310547 +186.9600067138672 +273.7591857910156 +236.7100067138672 +186.9644012451172 +274.6499938964844 +238.2899932861328 +189.97979736328125 +275.7049865722656 +237.55999755859375 +190.03500366210938 +274.5849914550781 +236.20640563964844 +189.1999969482422 +273.9599914550781 +236.25509643554688 +189.9600067138672 +272.989990234375 +235.1999969482422 +190.10000610351562 +272.4100036621094 +234.6999969482422 +190.27999877929688 +269.2799987792969 +230.72500610351562 +187.5500030517578 +267.8799133300781 +232.4199981689453 +187.1999969482422 +268.9200134277344 +233.52000427246094 +187.5800018310547 +267.7799987792969 +232.0 +186.72999572753906 +267.2900085449219 +231.39930725097656 +185.3300018310547 +266.44000244140625 +231.66000366210938 +184.93499755859375 +267.4599914550781 +232.88999938964844 +186.58999633789062 +267.6499938964844 +225.52000427246094 +181.85000610351562 +267.8399963378906 +226.25999450683594 +182.88999938964844 +267.1650085449219 +222.8144073486328 +181.5800018310547 +268.45001220703125 +223.64999389648438 +183.6199951171875 +268.03448486328125 +225.1999969482422 +183.4499969482422 +268.28021240234375 +224.1699981689453 +182.91000366210938 +267.510009765625 +222.55499267578125 +181.3000030517578 +271.8500061035156 +220.58999633789062 +187.6300048828125 +269.7300109863281 +222.05979919433594 +185.38999938964844 +270.3999938964844 +221.77999877929688 +184.38999938964844 +270.0299987792969 +220.58999633789062 +184.25999450683594 +269.6700134277344 +220.6999969482422 +184.6300048828125 +270.0350036621094 +222.67999267578125 +186.7050018310547 +268.57000732421875 +222.69000244140625 +186.69180297851562 +273.9049987792969 +226.41000366210938 +193.9199981689453 +271.7799987792969 +223.74000549316406 +189.75999450683594 +268.94000244140625 +219.4600067138672 +183.68519592285156 +268.80999755859375 +219.83389282226562 +184.50999450683594 +267.7950134277344 +219.57000732421875 +182.72000122070312 +267.32000732421875 +219.07000732421875 +182.3800048828125 +266.3800048828125 +217.14999389648438 +180.94000244140625 +269.8500061035156 +216.26499938964844 +175.7899932861328 +270.8999938964844 +218.5749969482422 +178.86000061035156 +270.54998779296875 +219.63999938964844 +181.07000732421875 +270.9800109863281 +218.7220001220703 +179.33470153808594 +272.6099853515625 +222.0500030517578 +184.19000244140625 +271.3699951171875 +220.18499755859375 +180.38999938964844 +271.489990234375 +220.64500427246094 +178.94000244140625 +273.0950012207031 +225.8699951171875 +178.0 +275.0 +224.94900512695312 +182.08999633789062 +274.8500061035156 +224.6199951171875 +182.47000122070312 +276.1199951171875 +224.97000122070312 +182.10000610351562 +276.2195129394531 +225.91000366210938 +181.8699951171875 +276.4750061035156 +226.09930419921875 +181.6699981689453 +275.9800109863281 +226.10000610351562 +182.5500030517578 +278.9049987792969 +226.7100067138672 +171.0749969482422 +277.8299865722656 +227.77000427246094 +174.7238006591797 +279.0700988769531 +229.25 +175.53500366210938 +278.760009765625 +229.55999755859375 +176.2050018310547 +278.0350036621094 +229.8000030517578 +174.77499389648438 +277.56500244140625 +229.49000549316406 +176.84170532226562 +276.95001220703125 +229.60000610351562 +177.8000030517578 +277.80999755859375 +230.51499938964844 +179.5850067138672 +279.0101013183594 +231.0841064453125 +180.91000366210938 +279.0790100097656 +230.8800048828125 +180.77999877929688 +278.54998779296875 +230.7100067138672 +180.80999755859375 +278.260009765625 +229.56500244140625 +180.5500030517578 +278.0799865722656 +229.42999267578125 +180.50999450683594 +277.4700012207031 +229.1199951171875 +180.19000244140625 +276.260009765625 +231.47999572753906 +177.2899932861328 +276.25 +231.94000244140625 +177.08140563964844 +277.04998779296875 +232.10450744628906 +177.1342010498047 +278.14208984375 +232.8800048828125 +178.86000061035156 +277.9200134277344 +233.97000122070312 +178.9600067138672 +279.7705078125 +234.36500549316406 +179.8350067138672 +280.58819580078125 +234.96009826660156 +179.40499877929688 +280.8900146484375 +234.17999267578125 +179.08999633789062 +281.9100036621094 +234.4781951904297 +179.37989807128906 +283.32000732421875 +233.9499969482422 +179.99000549316406 +284.57000732421875 +234.72000122070312 +183.2550048828125 +285.5400085449219 +234.39010620117188 +180.55999755859375 +285.8699951171875 +236.19000244140625 +182.16000366210938 +285.2149963378906 +235.16000366210938 +181.71499633789062 +285.625 +234.9821014404297 +181.0 +286.239990234375 +235.5 +181.42999267578125 +286.2300109863281 +234.3699951171875 +181.36000061035156 +287.34051513671875 +231.39999389648438 +180.3300018310547 +286.4100036621094 +232.18069458007812 +180.5500030517578 +286.385009765625 +232.47000122070312 +180.375 +285.6792907714844 +231.9600067138672 +180.64999389648438 +285.2099914550781 +231.92489624023438 +180.7449951171875 +284.55499267578125 +232.61000061035156 +180.02000427246094 +284.1499938964844 +232.3699951171875 +179.63999938964844 +281.2250061035156 +228.77499389648438 +181.08009338378906 +280.2799987792969 +227.89999389648438 +182.63510131835938 +280.114990234375 +227.1699981689453 +183.5449981689453 +280.0050048828125 +228.3000030517578 +183.61500549316406 +278.8599853515625 +228.30999755859375 +182.31500244140625 +280.125 +228.7082061767578 +182.32350158691406 +280.6499938964844 +229.10000610351562 +183.39999389648438 +280.4551086425781 +230.9384002685547 +182.7698974609375 +279.2950134277344 +229.6739959716797 +182.05999755859375 +278.31500244140625 +229.38999938964844 +181.77980041503906 +279.44000244140625 +229.83999633789062 +182.24000549316406 +279.2337951660156 +229.6750030517578 +181.45509338378906 +278.8013916015625 +229.25999450683594 +181.8574981689453 +278.7900085449219 +229.5500030517578 +182.35000610351562 +277.55999755859375 +229.0399932861328 +183.05059814453125 +277.4599914550781 +228.07000732421875 +183.48500061035156 +277.2300109863281 +227.2799072265625 +183.40499877929688 +276.9700012207031 +227.0500030517578 +185.89410400390625 +276.3599853515625 +227.08999633789062 +184.7064971923828 +276.92498779296875 +226.9741973876953 +184.88499450683594 +277.9599914550781 +226.99000549316406 +185.5800018310547 +277.70001220703125 +227.66000366210938 +184.6300048828125 +277.4100036621094 +227.83999633789062 +185.07000732421875 +277.875 +227.99000549316406 +184.88800048828125 +278.385009765625 +228.30999755859375 +184.8582000732422 +278.69000244140625 +227.97999572753906 +184.5449981689453 +277.864990234375 +227.9149932861328 +184.3300018310547 +277.2300109863281 +227.89999389648438 +184.97000122070312 +277.45001220703125 +231.73500061035156 +183.85960388183594 +278.2576904296875 +231.66000366210938 +182.8455047607422 +278.5264892578125 +230.72000122070312 +182.57000732421875 +278.1199951171875 +230.3350067138672 +182.61000061035156 +278.2200012207031 +230.26499938964844 +183.09579467773438 +278.9800109863281 +231.9199981689453 +183.7899932861328 +278.7200012207031 +231.69000244140625 +183.77999877929688 +276.1199951171875 +230.8800048828125 +178.0850067138672 +275.82501220703125 +228.85000610351562 +177.05990600585938 +277.9049987792969 +230.08250427246094 +178.4862060546875 +277.5226135253906 +229.47999572753906 +179.30499267578125 +277.760009765625 +229.8441925048828 +180.906494140625 +278.0950012207031 +229.6925048828125 +180.36990356445312 +278.05999755859375 +230.27000427246094 +180.9355010986328 +277.8699951171875 +226.3800048828125 +179.5399932861328 +277.739990234375 +226.02000427246094 +176.63499450683594 +277.8550109863281 +226.3300018310547 +176.52000427246094 +279.04998779296875 +226.99000549316406 +177.4499969482422 +277.95001220703125 +226.85000610351562 +176.2136993408203 +278.05499267578125 +226.71200561523438 +175.90499877929688 +278.3699951171875 +226.19000244140625 +174.99000549316406 +274.1449890136719 +223.02999877929688 +175.45159912109375 +275.510009765625 +224.38999938964844 +178.2519989013672 +274.9200134277344 +222.5449981689453 +177.59500122070312 +274.0400085449219 +222.375 +177.125 +273.3699951171875 +223.22259521484375 +177.13999938964844 +273.80499267578125 +222.6649932861328 +176.3300018310547 +274.114990234375 +222.5500030517578 +176.22999572753906 +273.1700134277344 +222.36500549316406 +176.1501007080078 +272.80999755859375 +222.75 +176.02000427246094 +273.20001220703125 +222.30999755859375 +176.48500061035156 +272.1300048828125 +221.47579956054688 +176.22000122070312 +273.56500244140625 +222.08999633789062 +176.74000549316406 +274.55999755859375 +222.64920043945312 +177.17880249023438 +274.4700012207031 +222.52999877929688 +177.50999450683594 +275.4949951171875 +224.77870178222656 +174.3800048828125 +273.489990234375 +224.13999938964844 +171.13499450683594 +272.8699951171875 +223.64500427246094 +171.4499053955078 +273.0199890136719 +223.7899932861328 +172.25 +273.7850036621094 +222.9149932861328 +170.9499053955078 +273.65008544921875 +222.02000427246094 +171.19000244140625 +271.8599853515625 +221.24099731445312 +170.9199981689453 +270.8999938964844 +227.58270263671875 +175.0399932861328 +272.29998779296875 +228.32000732421875 +174.88009643554688 +270.25 +225.80349731445312 +174.0399932861328 +272.6499938964844 +227.0449981689453 +174.91439819335938 +271.3699951171875 +226.58999633789062 +174.5500030517578 +271.8399963378906 +226.76499938964844 +174.6750030517578 +272.1600036621094 +226.75999450683594 +174.00999450683594 +271.7349853515625 +226.86000061035156 +178.66000366210938 +271.26080322265625 +227.85679626464844 +179.3000030517578 +270.6549987792969 +228.41000366210938 +180.5200958251953 +270.75 +228.66900634765625 +179.96499633789062 +271.3699951171875 +228.75990295410156 +180.57420349121094 +270.79998779296875 +228.64999389648438 +180.44850158691406 +273.6700134277344 +227.3699951171875 +180.99000549316406 +272.0150146484375 +227.82000732421875 +183.39999389648438 +272.44000244140625 +227.52999877929688 +183.6300048828125 +271.94000244140625 +228.01499938964844 +183.10000610351562 +270.9399108886719 +228.0 +183.22560119628906 +270.864990234375 +228.39500427246094 +183.3800048828125 +270.7200012207031 +228.83999633789062 +183.28500366210938 +270.82000732421875 +228.44000244140625 +183.61000061035156 +270.8399963378906 +230.11849975585938 +185.27499389648438 +271.7814025878906 +230.4600067138672 +187.91009521484375 +271.5299987792969 +231.38999938964844 +188.2144012451172 +271.70001220703125 +231.53799438476562 +187.9949951171875 +271.80999755859375 +232.0 +188.61810302734375 +272.10699462890625 +232.2100067138672 +188.78640747070312 +272.239990234375 +232.1199951171875 +189.2100067138672 +274.03509521484375 +232.10000610351562 +187.22999572753906 +274.85101318359375 +232.5399932861328 +187.94500732421875 +275.3599853515625 +232.80999755859375 +188.22500610351562 +274.8247985839844 +232.14990234375 +191.5800018310547 +274.8800048828125 +232.53500366210938 +191.02499389648438 +274.6400146484375 +232.95840454101562 +190.77969360351562 +274.5199890136719 +232.46580505371094 +191.53289794921875 +274.7601013183594 +232.74000549316406 +192.24000549316406 +273.9800109863281 +232.7949981689453 +191.42999267578125 +273.25 +232.5 +190.5399932861328 +273.9543151855469 +232.25 +187.2550048828125 +273.2200012207031 +231.52239990234375 +187.24459838867188 +273.0400085449219 +231.1300048828125 +186.8800048828125 +273.6400146484375 +231.50999450683594 +187.45989990234375 +273.67999267578125 +231.32000732421875 +187.375 +273.9028015136719 +232.10000610351562 +187.96449279785156 +273.79901123046875 +232.0800018310547 +188.22999572753906 +272.5899963378906 +231.30499267578125 +187.17030334472656 +272.85980224609375 +231.86000061035156 +188.25999450683594 +272.5899963378906 +231.2949981689453 +187.90989685058594 +273.1000061035156 +231.19569396972656 +188.21600341796875 +273.3900146484375 +231.6999053955078 +188.15420532226562 +273.1650085449219 +231.74000549316406 +187.5800018310547 +272.989990234375 +232.48989868164062 +187.5500030517578 +272.489990234375 +231.85879516601562 +189.01499938964844 +272.489990234375 +231.2100067138672 +188.8459930419922 +272.6700134277344 +231.36000061035156 +188.91990661621094 +272.625 +231.63999938964844 +188.97000122070312 +272.9609069824219 +231.8800048828125 +188.0449981689453 +272.0799865722656 +230.77999877929688 +187.13499450683594 +271.8399963378906 +230.83999633789062 +186.49000549316406 +273.3900146484375 +227.52499389648438 +190.58900451660156 +270.3245849609375 +225.88999938964844 +189.59939575195312 +270.1499938964844 +226.7064971923828 +189.47999572753906 +270.0799865722656 +225.6199951171875 +189.3616943359375 +270.1300048828125 +226.4499969482422 +189.20570373535156 +270.510009765625 +226.47999572753906 +188.9550018310547 +270.9800109863281 +226.5 +188.80990600585938 +269.80999755859375 +233.22000122070312 +190.0749969482422 +268.7900085449219 +232.25 +190.19000244140625 +266.9700012207031 +233.19000244140625 +187.6199951171875 +267.4200134277344 +232.61000061035156 +187.78500366210938 +266.2698974609375 +232.8450927734375 +186.64320373535156 +267.0190124511719 +232.64999389648438 +187.47000122070312 +267.260009765625 +233.0500030517578 +188.11000061035156 +264.0299987792969 +237.3300018310547 +191.39999389648438 +262.4198913574219 +238.6699981689453 +188.58999633789062 +262.8846130371094 +242.2301025390625 +189.03990173339844 +262.5400085449219 +241.69000244140625 +188.2899932861328 +262.87701416015625 +241.1750030517578 +187.9600067138672 +262.82000732421875 +240.86000061035156 +186.94000244140625 +262.42498779296875 +241.05499267578125 +187.25 +262.0299987792969 +242.42999267578125 +191.01499938964844 +261.0837097167969 +243.49000549316406 +189.5800018310547 +262.3599853515625 +244.41799926757812 +190.0030059814453 +261.2200012207031 +244.89999389648438 +189.625 +261.5899963378906 +243.25 +189.2801055908203 +261.3299865722656 +242.55999755859375 +188.99000549316406 +260.3599853515625 +241.5749969482422 +189.25 +256.7449951171875 +244.84010314941406 +186.10000610351562 +256.1099853515625 +244.47999572753906 +184.8800048828125 +256.7090148925781 +245.3679962158203 +184.25579833984375 +257.4800109863281 +245.67250061035156 +184.75 +256.6000061035156 +245.8000030517578 +184.14999389648438 +258.2799987792969 +245.80999755859375 +185.18649291992188 +259.05999755859375 +246.25900268554688 +185.1300048828125 +258.4599914550781 +245.66000366210938 +184.96200561523438 +256.9599914550781 +246.33250427246094 +185.30999755859375 +258.92999267578125 +245.9250030517578 +184.9541015625 +259.1199951171875 +245.75 +185.18499755859375 +259.7300109863281 +246.63009643554688 +185.88009643554688 +259.9649963378906 +247.0 +185.55499267578125 +259.3500061035156 +247.35000610351562 +184.85000610351562 +260.3500061035156 +247.6699981689453 +184.6199951171875 +260.2300109863281 +247.64759826660156 +185.23989868164062 +260.60931396484375 +248.0998992919922 +186.28500366210938 +260.8900146484375 +248.08999633789062 +186.7801055908203 +260.6400146484375 +248.0050048828125 +186.99000549316406 +260.9700012207031 +247.0500030517578 +186.00999450683594 +260.2099914550781 +246.4199981689453 +184.89999389648438 +260.090087890625 +243.5491943359375 +183.91749572753906 +259.9100036621094 +244.15499877929688 +185.22999572753906 +260.8399963378906 +244.35499572753906 +186.39999389648438 +259.989990234375 +242.71499633789062 +185.0699005126953 +259.739990234375 +241.3000030517578 +184.78990173339844 +259.0199890136719 +242.1199951171875 +184.72000122070312 +261.04998779296875 +242.61000061035156 +185.82000732421875 +259.75 +238.8300018310547 +181.6750030517578 +258.739990234375 +238.5800018310547 +181.98500061035156 +257.3800048828125 +237.49000549316406 +182.10000610351562 +257.5299987792969 +237.07000732421875 +182.22000122070312 +257.79998779296875 +237.57000732421875 +181.82000732421875 +259.9700012207031 +237.41000366210938 +182.14999389648438 +259.95001220703125 +236.6750030517578 +183.1699981689453 +260.10009765625 +237.75 +187.60000610351562 +260.4949951171875 +238.97999572753906 +187.5200958251953 +259.3299865722656 +239.49000549316406 +188.61349487304688 +259.5299987792969 +238.71499633789062 +189.2301025390625 +258.32000732421875 +237.85499572753906 +188.39500427246094 +257.6700134277344 +237.48269653320312 +187.4250030517578 +258.3299865722656 +238.1699981689453 +187.13999938964844 +256.80999755859375 +237.9199981689453 +187.63839721679688 +256.4399108886719 +237.8175048828125 +187.99000549316406 +255.8300018310547 +237.67919921875 +188.02999877929688 +256.0299987792969 +238.80499267578125 +187.93499755859375 +256.0 +237.64999389648438 +187.69000244140625 +256.17999267578125 +238.22500610351562 +187.74000549316406 +255.47999572753906 +239.05999755859375 +186.22999572753906 +251.61570739746094 +234.80690002441406 +180.8000030517578 +251.30499267578125 +234.2899932861328 +180.3199005126953 +250.55999755859375 +233.4600067138672 +180.0198974609375 +249.19500732421875 +231.77499389648438 +179.52000427246094 +247.45249938964844 +229.97999572753906 +179.43499755859375 +245.4600067138672 +230.6197052001953 +178.4949951171875 +246.69000244140625 +231.11000061035156 +178.2100067138672 +247.57000732421875 +231.25999450683594 +180.80999755859375 +247.3000030517578 +231.30499267578125 +182.73550415039062 +245.8300018310547 +228.44000244140625 +179.43499755859375 +245.8800048828125 +227.57000732421875 +180.2449951171875 +247.1103057861328 +229.42999267578125 +182.97999572753906 +248.38279724121094 +230.5399932861328 +183.7899932861328 +247.6300048828125 +231.35000610351562 +183.33999633789062 +250.1300048828125 +232.75 +184.8699951171875 +249.6999053955078 +234.77999877929688 +185.73550415039062 +249.74000549316406 +235.02740478515625 +184.97500610351562 +250.67999267578125 +235.22000122070312 +184.72549438476562 +250.52000427246094 +235.02000427246094 +184.65499877929688 +248.3699951171875 +233.97000122070312 +184.11000061035156 +248.36000061035156 +234.2899932861328 +184.85000610351562 +247.01010131835938 +238.0 +187.65499877929688 +248.35000610351562 +239.15499877929688 +187.75999450683594 +248.73989868164062 +239.86500549316406 +187.74009704589844 +247.92999267578125 +239.40609741210938 +187.89500427246094 +247.47500610351562 +239.4499969482422 +187.8300018310547 +248.19000244140625 +239.27000427246094 +187.22999572753906 +247.97000122070312 +239.19000244140625 +187.6699981689453 +254.0399932861328 +238.96499633789062 +187.3459930419922 +255.0998992919922 +239.84249877929688 +186.80499267578125 +254.5 +239.6300048828125 +186.66000366210938 +254.64999389648438 +239.0800018310547 +186.42999267578125 +255.94000244140625 +239.44000244140625 +186.5749969482422 +255.72500610351562 +239.24000549316406 +186.44500732421875 +255.4199981689453 +238.4199981689453 +186.38999938964844 +259.8450012207031 +242.0399932861328 +188.91510009765625 +260.7200012207031 +241.77000427246094 +189.70579528808594 +261.30999755859375 +242.35000610351562 +189.68499755859375 +260.2550048828125 +243.0800018310547 +189.48500061035156 +259.875 +243.8249969482422 +189.125 +259.3800048828125 +244.02999877929688 +189.4250030517578 +258.2699890136719 +244.67999267578125 +188.5399932861328 +256.0899963378906 +244.89999389648438 +191.40499877929688 +255.49000549316406 +243.0800018310547 +191.77999877929688 +254.82000732421875 +242.4425048828125 +191.09579467773438 +255.2550048828125 +242.94000244140625 +191.72000122070312 +255.11000061035156 +242.27000427246094 +191.52000427246094 +256.4750061035156 +243.08990478515625 +191.6230010986328 +256.44000244140625 +243.02000427246094 +191.52999877929688 +256.8999938964844 +238.78500366210938 +188.92999267578125 +256.1700134277344 +238.0 +187.8350067138672 +257.2200012207031 +239.97999572753906 +189.5449981689453 +257.3800048828125 +239.57260131835938 +190.05499267578125 +258.1449890136719 +239.51980590820312 +190.36000061035156 +258.2950134277344 +239.97999572753906 +190.94500732421875 +258.17498779296875 +241.67999267578125 +192.42999267578125 +254.0 +242.30999755859375 +191.65499877929688 +256.6875 +240.66009521484375 +192.231201171875 +255.2100067138672 +240.72000122070312 +192.8300018310547 +256.05499267578125 +238.63999938964844 +191.27000427246094 +257.5849914550781 +240.1699981689453 +191.47000122070312 +259.9100036621094 +239.94000244140625 +189.84500122070312 +259.4800109863281 +239.25999450683594 +191.28500366210938 +265.0400085449219 +244.7550048828125 +188.58749389648438 +264.29180908203125 +244.5399932861328 +189.139892578125 +264.17999267578125 +244.96029663085938 +189.21009826660156 +265.1300048828125 +243.5850067138672 +189.73500061035156 +267.17999267578125 +243.52999877929688 +189.9199981689453 +268.9800109863281 +242.9582061767578 +186.1750030517578 +269.9599914550781 +242.9409942626953 +185.69000244140625 +269.885009765625 +239.21499633789062 +180.29989624023438 +268.8949890136719 +237.5800018310547 +179.10000610351562 +268.8999938964844 +237.3000030517578 +180.00010681152344 +269.3399963378906 +236.92990112304688 +179.1584930419922 +271.4800109863281 +236.1699981689453 +178.69500732421875 +269.2099914550781 +237.3800048828125 +178.69700622558594 +269.4599914550781 +238.63299560546875 +180.3300018310547 +276.1000061035156 +237.4949951171875 +177.19520568847656 +277.21380615234375 +236.9499969482422 +175.25 +275.25 +233.42019653320312 +173.35000610351562 +275.6000061035156 +233.7449951171875 +174.12660217285156 +274.9100036621094 +232.60000610351562 +174.94009399414062 +277.6099853515625 +233.8000030517578 +175.27099609375 +276.4599914550781 +232.92999267578125 +174.1999969482422 +276.7850036621094 +222.27000427246094 +171.5850067138672 +275.2200012207031 +223.69000244140625 +174.2550048828125 +274.739990234375 +224.7050018310547 +175.28500366210938 +274.32000732421875 +223.3905029296875 +174.3300018310547 +277.0450134277344 +223.1699981689453 +173.6699981689453 +276.6300048828125 +223.1699981689453 +172.26010131835938 +275.9200134277344 +222.5 +171.82000732421875 +279.2900085449219 +204.8699951171875 +182.64999389648438 +279.114990234375 +204.89999389648438 +183.97999572753906 +278.67999267578125 +208.05999755859375 +184.5312042236328 +277.7749938964844 +207.25999450683594 +184.5102996826172 +277.1300048828125 +207.39999389648438 +184.44500732421875 +277.6600036621094 +207.7899932861328 +185.3350067138672 +278.0799865722656 +210.31500244140625 +185.41000366210938 +273.08270263671875 +207.14999389648438 +190.66000366210938 +273.398193359375 +209.6300048828125 +191.8249969482422 +272.0115051269531 +210.31500244140625 +191.58999633789062 +271.9800109863281 +210.44000244140625 +190.9929962158203 +273.6199951171875 +209.19000244140625 +191.00999450683594 +274.0400085449219 +209.03500366210938 +189.89999389648438 +274.5400085449219 +208.66000366210938 +189.7899932861328 +274.4200134277344 +211.80499267578125 +189.17320251464844 +274.05999755859375 +210.08740234375 +189.12010192871094 +273.3500061035156 +209.9949951171875 +189.69000244140625 +274.05499267578125 +207.75999450683594 +189.2449951171875 +273.9649963378906 +208.2550048828125 +189.21499633789062 +274.07000732421875 +207.71800231933594 +189.10000610351562 +273.7900085449219 +206.99000549316406 +188.61000061035156 +277.05010986328125 +204.96189880371094 +188.9199981689453 +278.19000244140625 +204.3800048828125 +191.289794921875 +279.94500732421875 +203.4492950439453 +191.98500061035156 +278.9599914550781 +204.27890014648438 +191.43099975585938 +279.5799865722656 +205.11500549316406 +192.0449981689453 +276.04998779296875 +203.88499450683594 +191.05999755859375 +275.5400085449219 +204.00999450683594 +190.02999877929688 +271.25 +202.31500244140625 +191.69000244140625 +266.1700134277344 +197.77000427246094 +187.30499267578125 +264.6000061035156 +199.5 +189.5749969482422 +262.3299865722656 +199.3350067138672 +189.25 +261.7799987792969 +199.1199951171875 +189.0500030517578 +261.489990234375 +198.375 +187.60000610351562 +261.5899963378906 +199.4499969482422 +186.91000366210938 diff --git a/messaging/config/krakend.json b/messaging/config/krakend.json index 9c4d09f..c583167 100644 --- a/messaging/config/krakend.json +++ b/messaging/config/krakend.json @@ -32,7 +32,7 @@ }, "backend": [ { - "url_pattern": "/__debug/hi" + "url_pattern": "/__debug/stocksconsumer/received" } ] }, @@ -77,7 +77,7 @@ }, "backend": [ { - "url_pattern": "/__debug/hi" + "url_pattern": "/__debug/portfolioupdates/received" } ] } diff --git a/messaging/config/telemetry-dashboards/grafana/datasources/prometheus-tempo.yml b/messaging/config/telemetry-dashboards/grafana/datasources/prometheus-tempo.yml index 9a04355..88d996e 100644 --- a/messaging/config/telemetry-dashboards/grafana/datasources/prometheus-tempo.yml +++ b/messaging/config/telemetry-dashboards/grafana/datasources/prometheus-tempo.yml @@ -18,18 +18,3 @@ datasources: editable: true # This UID matches the one used in the dashboard settings file uid: krakend_prometheus_datasource -- access: proxy - id: 2 - orgId: 1 - name: Tempo - type: tempo - typeName: Tempo - url: http://tempo:3200 - user: "" - database: "" - basicAuth: false - isDefault: false - jsonData: {} - readOnly: false - editable: true - uid: krakend_tempo_datasource \ No newline at end of file diff --git a/messaging/config/telemetry-dashboards/tempo/tempo.yaml b/messaging/config/telemetry-dashboards/tempo/tempo.yaml deleted file mode 100644 index 418cc3a..0000000 --- a/messaging/config/telemetry-dashboards/tempo/tempo.yaml +++ /dev/null @@ -1,60 +0,0 @@ -server: - http_listen_port: 3200 - -query_frontend: - search: - duration_slo: 5s - throughput_bytes_slo: 1.073741824e+09 - trace_by_id: - duration_slo: 5s - -# this configuration will listen on all ports and protocols that tempo is capable of. -# the receives all come from the OpenTelemetry collector. more configuration information can -# be found there: https://github.com/open-telemetry/opentelemetry-collector/tree/main/receiver -# for a production deployment you should only enable the receivers you need! -distributor: - receivers: - jaeger: - protocols: - thrift_http: - grpc: - thrift_binary: - thrift_compact: - zipkin: - otlp: - protocols: - http: - grpc: - -# cut the headblock when this much time passes. this is being set for demo purposes and should probably be left alone normally -ingester: - max_block_duration: 5m - -# overall Tempo trace retention. set for demo purposes -compactor: - compaction: - block_retention: 1h - -metrics_generator: - registry: - external_labels: - source: tempo - cluster: docker-compose - storage: - path: /tmp/tempo/generator/wal - remote_write: - - url: http://prometheus:9090/api/v1/write - send_exemplars: true - -storage: - trace: - backend: local # backend configuration to use - wal: - path: /tmp/tempo/wal # where to store the the wal locally - local: - path: /tmp/tempo/blocks - -overrides: - defaults: - metrics_generator: - processors: [service-graphs, span-metrics] # enables metrics generator diff --git a/messaging/docker-compose.yaml b/messaging/docker-compose.yaml index b541820..62f99d5 100644 --- a/messaging/docker-compose.yaml +++ b/messaging/docker-compose.yaml @@ -70,15 +70,12 @@ services: - "9090:9090" volumes: - "./config/telemetry-dashboards/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml" - tempo: - image: grafana/tempo:latest - domainname: tempo - container_name: messaging-tempo - command: [ "-config.file=/etc/tempo.yaml" ] - volumes: - - "./config/telemetry-dashboards/tempo/tempo.yaml:/etc/tempo.yaml" + jaeger: + image: jaegertracing/all-in-one:1 + environment: + - "COLLECTOR_OTLP_ENABLED=true" ports: - - "3200:3200" # tempo - - "9095:9095" # tempo grpc - - "54317:4317" # otlp grpc - - "54318:4318" # otlp http + - "16686:16686" # web interface + - "14268:14268" + - "54317:4317" # otlp grpc + - "54318:4318" # otlp http From f800bf2c6f4629e5716da93550b90e939a16ec4e Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Thu, 19 Feb 2026 23:19:47 +0100 Subject: [PATCH 13/20] update readme instructions --- messaging/README.md | 71 +++++++++---------- .../clients/kaf/producers/kaf_payload.txt | 1 - .../{kaf_ssl.sh => send_portfolio_update.sh} | 0 messaging/config/README.md | 2 - 4 files changed, 35 insertions(+), 39 deletions(-) delete mode 100644 messaging/clients/kaf/producers/kaf_payload.txt rename messaging/clients/kaf/producers/{kaf_ssl.sh => send_portfolio_update.sh} (100%) diff --git a/messaging/README.md b/messaging/README.md index 9e91fad..7f9e7a0 100644 --- a/messaging/README.md +++ b/messaging/README.md @@ -2,64 +2,63 @@ ## Environment -First of all, enter the `config` dir, and follow the -[README.md](./config/README.md) instructions to generate a self -signed certificate for the client and the `seckafkabroker` service, -to be able to use `mTLS` - -Once done that, launchthe test environment with: - -``` -docker compose up -d -``` +The first you running, you will need to generate the CA and the +self signed certificates. Run `make setup` and fill the required fields +and accept signing the certificates. (see [config's README.md](./confit/README.md)). It will bring up the following services: - `kafkabroker`: a single node kafka broker -- `seckafkabroker`: a single node +- `seckafkabroker`: a single node kafka broker configured to use + mTLS for its connections Along with services for telemetry: -- `grafana` -- `tempo` - `prometheus` +- `grafana` +- `jaeger` -[##](##) Producing messages +## The example "use case" -In order to produce messages you will need to have installed the -`kaf` tool: [https://github.com/birdayz/kaf](https://github.com/birdayz/kaf). +Imagine we want to automate some stocks buying and selling, based on +some custom logic that is implemented in some of our backends. -Under the [`clients/producer`](./clients/producer) folder you will find -two scripts: +We have a source of public reliable information that publishes stock +prices updates using a kafka service: that is `kafkabroker`. This service +has a `stockprice` topic, where we can subscribe to receive the updates. -- [`kaf.sh`](./clients/producer/kaf.sh): to generate fake data for the - `stockprice` topic on the `kafkabroker` server. -- [`kaf_ssh.sh`](./clients/producer/kaf_ssl.sh): to generate fake data for the - `portfolioupdates` topic on the `seckafkaborker`. +We also have a service that allows to manage our portfolio and execute +buy an sell order. To identify ourselves we are given a client certificate +that we will use to connect using `mTLS` to the service. That is +`seckafkabroker`. This service exposes a topic where we can place our +orders : `orderplacement`, and also offers us a topic `portfolioupdates` so we +get status updates on the executed orders. -### Kaf to produce message with SSL TLS +### Producing messages -https://github.com/birdayz/kaf/blob/master/examples/ssl_keys.yaml +In order to produce messages you will need to have installed the +`kaf` tool: [https://github.com/birdayz/kaf](https://github.com/birdayz/kaf). -## "Story Telling" +Under the [`clients/kak/producer`](./clients/kaf/producer) folder you will find +scripts to generate data: -The `kafkabroker` is a source of information for different market -prices updates, so, we create a couple of topics where we will -publish some data: +- [`generate_ticker_data.sh`](./clients/kaf/producers/generate_ticker_data.sh): will + emit messages for ticker from the `prices.txt` file every 1 second. + (we can change the period by changing the `SLEEP_PERIOD` variable). +- [`send_portfolio_update.sh`](./clients/producer/kaf_ssl.sh): to emit a fake + message in the `portfolioupdates` topic. +- [`kaf.sh`](./clients/producer/kaf.sh): to emit a single ticker value + to `stockprice` topic on the `kafkabroker` server. -- `stockprice`: some stock we are tracking +### Consumig message -The `seckafkabroker` is our secure connection to the bank to place -market orders, and get updates of the status of our portfolio, so, -we secure it with a mTLS connection: a certificate is required to -connect to it. +To chck the messages that are in the queues there are some scripts +in the `clients/kaf/consumers` directory. -- `orderplacement` -- `portfolioupdates` -# Improved Kafka support +# Improved Kafka support (Documentation) ## Async Agent diff --git a/messaging/clients/kaf/producers/kaf_payload.txt b/messaging/clients/kaf/producers/kaf_payload.txt deleted file mode 100644 index c529ff1..0000000 --- a/messaging/clients/kaf/producers/kaf_payload.txt +++ /dev/null @@ -1 +0,0 @@ -Name is Bart and Surname is Simpson diff --git a/messaging/clients/kaf/producers/kaf_ssl.sh b/messaging/clients/kaf/producers/send_portfolio_update.sh similarity index 100% rename from messaging/clients/kaf/producers/kaf_ssl.sh rename to messaging/clients/kaf/producers/send_portfolio_update.sh diff --git a/messaging/config/README.md b/messaging/config/README.md index 5268b61..bb4c01f 100644 --- a/messaging/config/README.md +++ b/messaging/config/README.md @@ -7,5 +7,3 @@ to the keystore). You can edit the `env.sh` file to change settins if you want, however, the only interesting variable to look at is the keystore password (that is set to `ksp4ssword`). - -After genrating the self signed CA you can start the docker compose environment. From e4e699e8dc628500241dbd254590e48dd5e7fe7a Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Fri, 20 Feb 2026 10:19:05 +0100 Subject: [PATCH 14/20] update readme --- messaging/README.md | 67 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 6 deletions(-) diff --git a/messaging/README.md b/messaging/README.md index 7f9e7a0..1e861a3 100644 --- a/messaging/README.md +++ b/messaging/README.md @@ -31,7 +31,7 @@ We also have a service that allows to manage our portfolio and execute buy an sell order. To identify ourselves we are given a client certificate that we will use to connect using `mTLS` to the service. That is `seckafkabroker`. This service exposes a topic where we can place our -orders : `orderplacement`, and also offers us a topic `portfolioupdates` so we +orders: `orderplacement`, and also offers us a topic `portfolioupdates` so we get status updates on the executed orders. @@ -52,10 +52,14 @@ scripts to generate data: - [`kaf.sh`](./clients/producer/kaf.sh): to emit a single ticker value to `stockprice` topic on the `kafkabroker` server. -### Consumig message +### Consuming messages To chck the messages that are in the queues there are some scripts -in the `clients/kaf/consumers` directory. +in the `clients/kaf/consumers` directory: + +- `kaf_consume.sh`: to see the `stockprice` topic +- `seckaf_consume.sh`: to see what is in the seckafkabroker topics + (edit the script to select the topic to read from). # Improved Kafka support (Documentation) @@ -66,9 +70,14 @@ The `async_agent` section in the main config contains an array of objects that define the configuration of a given async agent. By using the `async/kafka` namespace under the `extra_config` key, we select the Kafka driver. +The driver fields are the same that can be found in the kafka pubsub +subscriber config `reader` field: + - `group_id`: the name of the consumer group to use -- `topics`: a list of topics to read from -- `connection`: details +- `key_meta`: the name of the header where the kafka message key value is written +- `topics`: a list of topics to read from. +- `connection`: details to connect to the kafka service +- `consumer`: details about to read from the topic #### The `connection` config @@ -117,7 +126,46 @@ namespace under the `extra_config` key, we select the Kafka driver. Since the `topic` to consume from is already defines at the general async agent config level, here we define properties specific for the kafka driver. - +- `group_session_timeout`: The timeout used to detect consumer failures when using Kafka's group management facility. + The consumer sends periodic heartbeats to indicate its liveness to the broker. + If no heartbeats are received by the broker before the expiration of this session timeout, + then the broker will remove this consumer from the group and initiate a rebalance. + Note that the value must be in the allowable range as configured in the broker configuration + by `group.min.session.timeout.ms` and `group.max.session.timeout.ms` (default 10s) + + +- `group_heartbeat_interval`: The expected time between heartbeats to the consumer coordinator when using Kafka's group + management facilities. Heartbeats are used to ensure that the consumer's session stays active and + to facilitate rebalancing when new consumers join or leave the group. + The value must be set lower than Consumer.Group.Session.Timeout, but typically should be set no + higher than 1/3 of that value. + It can be adjusted even lower to control the expected time for normal rebalances (default 3s) + + +- `group_rebalance_strategies`: the priority-ordered list of client-side consumer group + balancing strategies that will be offered to the coordinator. The first + strategy that all group members support will be chosen by the leader. + default: [ NewBalanceStrategyRange() ] + can be : + range -> RangeBalanceStrategyName + roundrobin -> RoundRobinBalanceStrategyName + sticky -> StickyBalanceStrategyName +- `group_rebalance_timeout`: The maximum allowed time for each worker to join the + group once a rebalance has begun. + This is basically a limit on the amount of time needed for all tasks to flush any pending + data and commit offsets. If the timeout is exceeded, then the worker will be removed from + the group, which will cause offset commit failures (default 60s). +- `group_instance_id`: support KIP-345 + +- `fetch_default`: The default number of message bytes to fetch from the broker in each + request (default 1MB). This should be larger than the majority of + your messages, or else the consumer will spend a lot of time + negotiating sizes and not actually consuming. Similar to the JVM's + `fetch.message.max.bytes`. + +- `isolation_level`: IsolationLevel support 2 mode: + - use `read_commited` (default) to consume and return all messages in message channel + - use `read_uncommited` to hide messages that are part of an aborted transaction ## Pub Sub @@ -186,6 +234,10 @@ The configuration has the following properties: ### Consumer config +It only contains a `reader` field, that corresponds to the same configuration +that the async kafka driver uses. + +- `reader`: same configuration that the async kafka driver uses. ## OpenTelemery @@ -211,3 +263,6 @@ All of these matrics have these attributes set: - `messaging.write.failure.count`: count of messages failed to be written +## **ACK** behaviour in Kafka + +TODO: put here the explanation of not acking a message, bug acking the one that comes after it From 2391fa48842435fb05ef51c162fbaed1d9ae322a Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Tue, 24 Feb 2026 08:32:07 +0100 Subject: [PATCH 15/20] add documentation about partition selection options --- messaging/README.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/messaging/README.md b/messaging/README.md index 1e861a3..fe361d3 100644 --- a/messaging/README.md +++ b/messaging/README.md @@ -223,6 +223,18 @@ The configuration has the following properties: - `compression_level`: (int, optional) The level of compression to use on messages. The meaning depends on the actual compression type used and defaults to default compression level for the codec. +- `partitioner`: (string, optional) defines how to select the partition to send + messages to (defaults to `standard`). Similar to the `partitioner.class` + setting for the JVM producer. Have the following options: + - `standard` is like `sarama` except that it handles absolute values + in the same way as the reference Java implementation. `sarama` was supposed to do + that but it had a mistake and now there are people depending on both behaviours. + - `sarama`: behaves as follows: If the message's key is nil then a + random partition is chosen. Otherwise the FNV-1a hash of the encoded bytes + of the message key is used, modulus the number of partitions. This ensures + that messages with the same key always end up on the same partition. + - `random` chooses a random partition each time. + - `roundrobin` walks through the available partitions one at a time. - `idempotent`: (boolean, optional) If enabled, the producer will ensure that exactly one copy of each message is written. - `retry_max`: (int, optional) The total number of times to retry sending a message (default 3). From ac188199f7d808ca6a9d382c6bbab1902dbba37e Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Tue, 24 Feb 2026 11:00:18 +0100 Subject: [PATCH 16/20] add missing Makefile --- messaging/Makefile | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 messaging/Makefile diff --git a/messaging/Makefile b/messaging/Makefile new file mode 100644 index 0000000..9526db4 --- /dev/null +++ b/messaging/Makefile @@ -0,0 +1,22 @@ +setup: + cd ./config && source ./setup.sh + docker compose up -d +.PHONY: setup + +cleanup: + docker compose down + cd ./config && source ./cleanup.sh +.PHONY: cleanup + +up: + docker compose up -d +.PHONY: up + +down: + docker compose down +.PHONY: down + +run: + ./krakend run -c ./config/krakend.json +.PHONY: run + From 15fb03fa6aa71874fde3d7b200e5139068cb3d96 Mon Sep 17 00:00:00 2001 From: kpacha Date: Tue, 10 Mar 2026 15:36:04 +0100 Subject: [PATCH 17/20] shebang fixed Signed-off-by: kpacha --- messaging/clients/kaf/consumers/kaf_consume.sh | 2 +- messaging/clients/kaf/consumers/seckaf_consume.sh | 2 +- messaging/clients/kaf/producers/generate_ticker_data.sh | 2 +- messaging/clients/kaf/producers/kaf.sh | 4 ++-- messaging/clients/kaf/producers/send_portfolio_update.sh | 2 +- messaging/config/cleanup.sh | 2 ++ messaging/config/env.sh | 2 +- messaging/config/setup.sh | 2 +- 8 files changed, 10 insertions(+), 8 deletions(-) diff --git a/messaging/clients/kaf/consumers/kaf_consume.sh b/messaging/clients/kaf/consumers/kaf_consume.sh index 8f6dce5..db24648 100755 --- a/messaging/clients/kaf/consumers/kaf_consume.sh +++ b/messaging/clients/kaf/consumers/kaf_consume.sh @@ -1,4 +1,4 @@ -#/bin/bash +#!/bin/bash export KTOPIC=stockprice kaf consume \ ${KTOPIC} \ diff --git a/messaging/clients/kaf/consumers/seckaf_consume.sh b/messaging/clients/kaf/consumers/seckaf_consume.sh index 99351cd..49671a4 100755 --- a/messaging/clients/kaf/consumers/seckaf_consume.sh +++ b/messaging/clients/kaf/consumers/seckaf_consume.sh @@ -1,4 +1,4 @@ -#/bin/bash +#!/bin/bash export KTOPIC=portfolioupdates export KTOPIC=orderplacement kaf consume \ diff --git a/messaging/clients/kaf/producers/generate_ticker_data.sh b/messaging/clients/kaf/producers/generate_ticker_data.sh index 864b4cb..5da5f72 100755 --- a/messaging/clients/kaf/producers/generate_ticker_data.sh +++ b/messaging/clients/kaf/producers/generate_ticker_data.sh @@ -1,4 +1,4 @@ -#/bin/bash +#!/bin/bash # this script produces fake ticker prices, using the `prices.txt` data # with each line for each of the list of tickers diff --git a/messaging/clients/kaf/producers/kaf.sh b/messaging/clients/kaf/producers/kaf.sh index 2265647..646076b 100755 --- a/messaging/clients/kaf/producers/kaf.sh +++ b/messaging/clients/kaf/producers/kaf.sh @@ -1,6 +1,6 @@ -#/bin/bash +#!/bin/bash KTOPIC=stockprice -KADDRESS=shrimp.ln:9092 +KADDRESS=localhost:9092 SLEEP_PERIOD=5 PRICES=("309.28", "312.59", "315.7", "314.68", "311.9", "309.70", "319.00") diff --git a/messaging/clients/kaf/producers/send_portfolio_update.sh b/messaging/clients/kaf/producers/send_portfolio_update.sh index c066038..a3c8e8a 100755 --- a/messaging/clients/kaf/producers/send_portfolio_update.sh +++ b/messaging/clients/kaf/producers/send_portfolio_update.sh @@ -1,4 +1,4 @@ -#/bin/bash +#!/bin/bash kaf produce \ portfolioupdates \ diff --git a/messaging/config/cleanup.sh b/messaging/config/cleanup.sh index f316537..779d3f4 100644 --- a/messaging/config/cleanup.sh +++ b/messaging/config/cleanup.sh @@ -1,3 +1,5 @@ +#!/bin/bash + rm ./ca/*.pem rm ./ca/ca_database* rm ./ca/ca_serial* diff --git a/messaging/config/env.sh b/messaging/config/env.sh index 3a72ce0..e7af280 100644 --- a/messaging/config/env.sh +++ b/messaging/config/env.sh @@ -1,4 +1,4 @@ -#/bin/bash +#!/bin/bash export SERVER_CERT_SIGN_REQUEST=${PWD}/certs/server/localhost.csr export SERVER_SIGNED_CERT=${PWD}/certs/server/localhost.signed.pem diff --git a/messaging/config/setup.sh b/messaging/config/setup.sh index ce1115a..1f0f93d 100644 --- a/messaging/config/setup.sh +++ b/messaging/config/setup.sh @@ -1,4 +1,4 @@ -#/bin/bash +#!/bin/bash mkdir -p ./certs/server mkdir -p ./certs/client From f6aeef0ea8267242f3319aedc36f1a62121e4307 Mon Sep 17 00:00:00 2001 From: kpacha Date: Tue, 10 Mar 2026 15:38:12 +0100 Subject: [PATCH 18/20] host should be localhost, by now Signed-off-by: kpacha --- messaging/clients/kaf/producers/generate_ticker_data.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/messaging/clients/kaf/producers/generate_ticker_data.sh b/messaging/clients/kaf/producers/generate_ticker_data.sh index 5da5f72..e61314c 100755 --- a/messaging/clients/kaf/producers/generate_ticker_data.sh +++ b/messaging/clients/kaf/producers/generate_ticker_data.sh @@ -3,7 +3,7 @@ # this script produces fake ticker prices, using the `prices.txt` data # with each line for each of the list of tickers KTOPIC=stockprice -KADDRESS=shrimp.ln:9092 +KADDRESS=localhost:9092 echo -e "Producing: $KKEY into '$KTOPIC' topic\n" From 60fb00e854e935a4ca7237985ebb0e8cee3b0ed7 Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Wed, 11 Mar 2026 15:58:31 +0100 Subject: [PATCH 19/20] fix messaging example to work with 2.13 config format and add curl scripts to generate ticker data --- messaging/Makefile | 4 +- messaging/README.md | 13 + .../clients/curl/generate_ticker_data.sh | 26 + .../clients/curl/post_portfolio_order.sh | 18 +- messaging/clients/curl/prices.txt | 5298 +++++++++++++++++ messaging/clients/curl/test_get.sh | 13 + messaging/clients/curl/test_post.sh | 14 + messaging/config/krakend.json | 60 +- .../prometheus/prometheus.yml | 2 +- 9 files changed, 5422 insertions(+), 26 deletions(-) create mode 100755 messaging/clients/curl/generate_ticker_data.sh create mode 100644 messaging/clients/curl/prices.txt create mode 100755 messaging/clients/curl/test_get.sh create mode 100755 messaging/clients/curl/test_post.sh diff --git a/messaging/Makefile b/messaging/Makefile index 9526db4..2c1d6ff 100644 --- a/messaging/Makefile +++ b/messaging/Makefile @@ -1,11 +1,11 @@ setup: - cd ./config && source ./setup.sh + cd ./config && bash ./setup.sh docker compose up -d .PHONY: setup cleanup: docker compose down - cd ./config && source ./cleanup.sh + cd ./config && bash ./cleanup.sh .PHONY: cleanup up: diff --git a/messaging/README.md b/messaging/README.md index fe361d3..cc99d91 100644 --- a/messaging/README.md +++ b/messaging/README.md @@ -62,6 +62,19 @@ in the `clients/kaf/consumers` directory: (edit the script to select the topic to read from). +# Troubleshooting + +### cannot find certificates + +In case you have your certificates in a custom directory (probably because +you are running a local instance of KrakenD), and you cannot connect +to a mTLS kafka broker, you will get a `connection refused` error, like this one: + +``` +[KRAKEND] 2026/02/23 - 16:54:02.222 :arrow_forward: ERROR [BACKEND: /_consumer/][backend/pubsub/subscriber/kafka](GET /portfolio/order) cannot instantiate: cannot initialize kafka reader: "cannot open subscription: kafka: client has run out of available brokers to talk to: dial tcp [::1]:49092: connect: connection refused" +``` + +In that case, check # Improved Kafka support (Documentation) ## Async Agent diff --git a/messaging/clients/curl/generate_ticker_data.sh b/messaging/clients/curl/generate_ticker_data.sh new file mode 100755 index 0000000..fbda101 --- /dev/null +++ b/messaging/clients/curl/generate_ticker_data.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# this script produces fake ticker prices, using the `prices.txt` data +# with each line for each of the list of tickers +KRAKEND_ADDRESS=localhost:8080 +SLEEP_PERIOD=1 +TICKERS=('NVDA', 'AAPL', 'AMZN') + +export idx=0 +while read -r line +do + export idx=$(expr $idx + 1) + export idx=$(expr $idx % 3) + + export PRICE=$line + export TICKER=${TICKERS[$idx]} + export KKEY=$(date +%Y%m%d_%H%M%S) + echo '{"ticker": "$TICKER", "price": $PRICE}' | envsubst | \ + curl -X POST \ + -H 'Content-Type:application/json' \ + -H "X-Ticker: $TICKER" \ + -H "X-Time: $KKEY" \ + --data-binary @- \ + http://${KRAKEND_ADDRESS}/ticker/publish + sleep $SLEEP_PERIOD +done < './prices.txt' diff --git a/messaging/clients/curl/post_portfolio_order.sh b/messaging/clients/curl/post_portfolio_order.sh index 35bbc86..0335443 100755 --- a/messaging/clients/curl/post_portfolio_order.sh +++ b/messaging/clients/curl/post_portfolio_order.sh @@ -1,8 +1,16 @@ #!/bin/bash export IKEY=$(date +%Y%m%d_%H%M%S) -curl -X POST \ - -H "X-Idempotency-Key: $IKEY" \ - -H 'Some-Meta: avocados' \ - -d '{"foo": "bar"}' \ - http://localhost:8080/portfolio/order +export ACTION="buy" +export AMOUNT=$(expr $RANDOM % 100) +export STOCK="AAPL" + +echo "Publishing order: $ACTION $STOCK (amount: $AMOUNT)" + +echo '{"action": "$ACTION", "amount": "$AMOUNT", "stock": "$STOCK"}' | \ + envsubst | \ + curl -X POST \ + -H "X-Idempotency-Key: $IKEY" \ + -H 'Some-Meta: avocados' \ + --data-binary @- \ + http://localhost:8080/portfolio/order diff --git a/messaging/clients/curl/prices.txt b/messaging/clients/curl/prices.txt new file mode 100644 index 0000000..f6481a8 --- /dev/null +++ b/messaging/clients/curl/prices.txt @@ -0,0 +1,5298 @@ +229.86619567871094 +233.5500030517578 +134.41000366210938 +229.36000061035156 +233.0800018310547 +133.47500610351562 +228.470703125 +231.88999938964844 +134.0290069580078 +228.47000122070312 +232.4600067138672 +134.3300018310547 +228.6999053955078 +233.0399932861328 +134.51499938964844 +227.69000244140625 +233.58999633789062 +134.51930236816406 +227.63999938964844 +233.1300048828125 +133.50999450683594 +233.33999633789062 +232.69119262695312 +133.94500732421875 +234.64999389648438 +231.3549041748047 +133.9698944091797 +234.57229614257812 +231.0 +132.7100067138672 +233.5449981689453 +231.8350067138672 +132.83230590820312 +233.3699951171875 +231.6699981689453 +133.03500366210938 +233.1107940673828 +232.32000732421875 +133.45140075683594 +232.77000427246094 +232.80999755859375 +132.8699951171875 +233.60499572753906 +229.85000610351562 +131.32020568847656 +235.07000732421875 +229.61000061035156 +130.61990356445312 +235.2899932861328 +230.76499938964844 +131.5749969482422 +235.47999572753906 +230.8800048828125 +130.97500610351562 +236.2100067138672 +230.7135009765625 +130.6898956298828 +236.46499633789062 +229.85499572753906 +131.52499389648438 +236.88999938964844 +228.89999389648438 +131.07989501953125 +237.8800048828125 +229.50379943847656 +134.5500030517578 +240.47999572753906 +228.6199951171875 +135.71499633789062 +240.34500122070312 +228.11500549316406 +135.00999450683594 +241.02999877929688 +228.1699981689453 +134.52499389648438 +241.7698974609375 +229.18280029296875 +135.12030029296875 +241.5449981689453 +229.63499450683594 +135.36129760742188 +241.52000427246094 +230.36000061035156 +135.25 +244.3800048828125 +227.7899932861328 +138.00010681152344 +243.94500732421875 +228.72999572753906 +136.5800018310547 +243.81520080566406 +228.29440307617188 +136.74009704589844 +243.99989318847656 +228.6699981689453 +137.3376007080078 +244.14999389648438 +228.93499755859375 +137.82000732421875 +244.10000610351562 +228.67999267578125 +138.36509704589844 +244.57000732421875 +228.67999267578125 +138.86000061035156 +244.0904998779297 +225.19140625 +140.66000366210938 +244.72999572753906 +224.95950317382812 +141.19500732421875 +244.42999267578125 +224.47500610351562 +139.96499633789062 +243.43499755859375 +224.10299682617188 +140.15139770507812 +243.05499267578125 +224.40269470214844 +139.5749969482422 +243.52000427246094 +224.58999633789062 +139.54989624023438 +244.47000122070312 +226.6699981689453 +139.41000366210938 +243.9398956298828 +224.00999450683594 +139.3300018310547 +244.3957061767578 +224.52000427246094 +139.94830322265625 +245.14999389648438 +224.62010192871094 +139.81500244140625 +244.7100067138672 +224.76499938964844 +140.639892578125 +244.9001007080078 +225.49000549316406 +140.44509887695312 +244.8800048828125 +226.0399932861328 +139.31939697265625 +244.8800048828125 +226.6699981689453 +139.24000549316406 +244.7449951171875 +223.4600067138672 +138.62060546875 +246.13059997558594 +222.61000061035156 +138.3000030517578 +246.3800048828125 +222.72000122070312 +139.5800018310547 +245.44500732421875 +222.35000610351562 +139.49000549316406 +245.2550048828125 +222.5399932861328 +139.80490112304688 +245.6199951171875 +222.69000244140625 +139.89999389648438 +245.86000061035156 +222.8699951171875 +140.1199951171875 +245.7899932861328 +219.4949951171875 +139.22999572753906 +247.1300048828125 +219.26499938964844 +139.19920349121094 +247.3699951171875 +217.6300048828125 +138.99110412597656 +247.44119262695312 +216.04969787597656 +137.1699981689453 +246.49000549316406 +214.9600067138672 +135.39669799804688 +245.8000030517578 +216.4398956298828 +135.10000610351562 +245.58999633789062 +216.49000549316406 +134.27000427246094 +247.85000610351562 +213.63510131835938 +132.92999267578125 +247.11019897460938 +214.19000244140625 +134.0399932861328 +247.7949981689453 +214.6999969482422 +134.60000610351562 +248.0500030517578 +214.97279357910156 +134.6199951171875 +248.66000366210938 +214.58709716796875 +132.72000122070312 +247.61000061035156 +214.2613067626953 +132.57000732421875 +247.22999572753906 +212.72999572753906 +130.10000610351562 +245.11000061035156 +207.11500549316406 +125.33999633789062 +246.52499389648438 +205.97000122070312 +126.19000244140625 +249.5800018310547 +207.80560302734375 +128.52499389648438 +247.97999572753906 +209.52999877929688 +128.3699951171875 +247.66810607910156 +210.75999450683594 +127.2699966430664 +247.72000122070312 +212.5399932861328 +128.81500244140625 +247.0500030517578 +212.8000030517578 +126.62999725341797 +243.47999572753906 +216.91000366210938 +130.4499969482422 +241.80999755859375 +216.8800048828125 +132.4149932861328 +243.1300048828125 +217.07000732421875 +132.55679321289062 +240.34030151367188 +214.67999267578125 +130.3751983642578 +239.82000732421875 +213.77000427246094 +129.88999938964844 +239.9499969482422 +213.72000122070312 +130.74000549316406 +240.30999755859375 +214.27000427246094 +131.52000427246094 +241.375 +214.41000366210938 +127.4800033569336 +241.52000427246094 +214.10870361328125 +126.27999877929688 +241.05799865722656 +213.65499877929688 +127.08000183105469 +241.89999389648438 +213.75 +127.61000061035156 +240.6300048828125 +211.08999633789062 +123.74500274658203 +238.9199981689453 +209.80999755859375 +121.91000366210938 +237.3800048828125 +208.82000732421875 +120.01000213623047 +237.59500122070312 +210.5742950439453 +122.7300033569336 +236.9199981689453 +209.3699951171875 +121.55999755859375 +237.60499572753906 +209.28500366210938 +122.18099975585938 +237.41000366210938 +208.5124053955078 +120.57990264892578 +237.9199981689453 +208.20249938964844 +120.47000122070312 +239.7100067138672 +209.77000427246094 +121.88500213623047 +241.83999633789062 +212.3000030517578 +125.05000305175781 +241.48500061035156 +210.6699981689453 +119.51000213623047 +241.19000244140625 +208.6699981689453 +119.22000122070312 +242.5399932861328 +209.2332000732422 +118.41000366210938 +240.96499633789062 +207.36000061035156 +115.23999786376953 +241.15179443359375 +207.24000549316406 +116.04499816894531 +236.8892059326172 +204.22999572753906 +113.16999816894531 +238.13999938964844 +205.05999755859375 +114.01000213623047 +238.39999389648438 +198.35000610351562 +111.61000061035156 +238.6300048828125 +199.40499877929688 +111.83000183105469 +238.1649932861328 +203.06500244140625 +116.01020050048828 +236.75 +202.89999389648438 +116.19999694824219 +238.2888946533203 +204.85000610351562 +117.7698974609375 +238.69000244140625 +206.1999969482422 +118.88999938964844 +236.07000732421875 +203.85000610351562 +115.95999908447266 +230.9199981689453 +205.19500732421875 +115.97000122070312 +230.6490020751953 +205.44500732421875 +115.40989685058594 +234.53990173339844 +207.34500122070312 +116.56310272216797 +234.67999267578125 +207.67999267578125 +116.2699966430664 +235.74749755859375 +208.64999389648438 +117.10980224609375 +236.0399932861328 +209.10040283203125 +117.66000366210938 +235.77000427246094 +208.4600067138672 +117.29000091552734 +236.47000122070312 +205.1199951171875 +114.84439849853516 +236.77999877929688 +203.8350067138672 +114.05999755859375 +234.4149932861328 +201.31500244140625 +111.6355972290039 +234.2949981689453 +200.8350067138672 +111.53500366210938 +233.69000244140625 +198.8000030517578 +110.52999877929688 +235.17999267578125 +199.52000427246094 +111.09719848632812 +235.32000732421875 +200.6999969482422 +110.58000183105469 +238.30999755859375 +199.4250030517578 +111.04000091552734 +239.02000427246094 +194.52499389648438 +109.69999694824219 +239.2899932861328 +193.9199981689453 +109.00499725341797 +240.41439819335938 +197.16009521484375 +110.50890350341797 +239.64999389648438 +200.3350067138672 +112.25 +238.8114013671875 +199.13999938964844 +112.6050033569336 +239.07000732421875 +199.27000427246094 +112.7300033569336 +228.5500030517578 +193.30999755859375 +108.06439971923828 +226.50869750976562 +194.33999633789062 +107.658203125 +225.47999572753906 +193.63999938964844 +108.08499908447266 +225.2100067138672 +193.18190002441406 +107.06009674072266 +226.5800018310547 +192.345703125 +106.76000213623047 +226.9761962890625 +193.0800018310547 +106.64990234375 +227.54100036621094 +194.66000366210938 +107.0199966430664 +222.52000427246094 +195.47500610351562 +106.30999755859375 +221.00320434570312 +197.11000061035156 +108.8949966430664 +218.5500030517578 +196.4499969482422 +108.81999969482422 +217.7550048828125 +193.5500030517578 +107.55999755859375 +220.5449981689453 +197.25999450683594 +110.43000030517578 +221.82020568847656 +198.34500122070312 +110.80860137939453 +220.72999572753906 +196.5 +108.63999938964844 +218.9499969482422 +198.58999633789062 +114.65010070800781 +216.44500732421875 +196.78500366210938 +114.51000213623047 +218.3603973388672 +199.52000427246094 +115.83499908447266 +218.18980407714844 +199.4333953857422 +116.11499786376953 +216.11000061035156 +199.22000122070312 +115.55500030517578 +215.639892578125 +199.01499938964844 +115.44999694824219 +216.94000244140625 +198.88999938964844 +115.73999786376953 +214.27999877929688 +195.71499633789062 +116.65499877929688 +214.0402069091797 +194.85000610351562 +116.08000183105469 +211.94000244140625 +193.7100067138672 +115.86090087890625 +211.15499877929688 +192.5399932861328 +115.26499938964844 +212.2899932861328 +193.89999389648438 +116.94999694824219 +210.6300048828125 +193.05999755859375 +116.00499725341797 +209.7100067138672 +193.91000366210938 +115.70999908447266 +210.3780975341797 +195.8350067138672 +119.52490234375 +211.92999267578125 +197.25999450683594 +120.93000030517578 +212.23069763183594 +197.41000366210938 +120.51499938964844 +212.31500244140625 +197.6699981689453 +120.54499816894531 +211.2449951171875 +197.0500030517578 +120.2750015258789 +212.90530395507812 +197.66250610351562 +120.58499908447266 +213.3800048828125 +197.94000244140625 +121.44999694824219 +213.22470092773438 +196.1649932861328 +119.53500366210938 +210.75469970703125 +195.4199981689453 +119.29499816894531 +211.1999969482422 +194.71299743652344 +118.36509704589844 +212.33030700683594 +196.1403045654297 +119.17489624023438 +214.4550018310547 +198.36000061035156 +120.5 +214.68499755859375 +197.47000122070312 +120.3644027709961 +214.19000244140625 +195.85000610351562 +119.4800033569336 +214.55140686035156 +190.82000732421875 +115.83999633789062 +213.3300018310547 +191.72000122070312 +116.75499725341797 +213.72000122070312 +192.24000549316406 +117.63999938964844 +212.2834014892578 +192.05999755859375 +117.15499877929688 +211.9949951171875 +192.56500244140625 +116.63870239257812 +212.34500122070312 +193.35499572753906 +116.13500213623047 +212.7899932861328 +192.91000366210938 +115.58000183105469 +217.14500427246094 +193.47999572753906 +116.98999786376953 +215.66900634765625 +193.4499969482422 +117.24500274658203 +215.3000030517578 +193.78500366210938 +118.0250015258789 +214.3800048828125 +192.21499633789062 +117.45860290527344 +214.27000427246094 +193.2449951171875 +118.53600311279297 +215.50990295410156 +194.33999633789062 +118.25 +215.3000030517578 +195.52000427246094 +117.5199966430664 +216.9904022216797 +197.80999755859375 +118.9000015258789 +216.0500030517578 +198.00999450683594 +119.63999938964844 +214.13999938964844 +195.0800018310547 +118.29000091552734 +213.22999572753906 +194.2595977783203 +117.88899993896484 +212.75999450683594 +193.7657012939453 +118.0791015625 +212.68350219726562 +194.14999389648438 +118.04499816894531 +214.14999389648438 +194.9499969482422 +118.47000122070312 +213.74000549316406 +195.15499877929688 +116.46939849853516 +213.44349670410156 +194.19119262695312 +116.29000091552734 +214.65499877929688 +195.35000610351562 +117.3499984741211 +214.6199951171875 +195.22500610351562 +117.06500244140625 +214.6699981689453 +195.375 +117.19110107421875 +215.30999755859375 +195.5802001953125 +116.78500366210938 +218.36000061035156 +196.22000122070312 +117.63500213623047 +219.77000427246094 +202.79359436035156 +120.4800033569336 +219.15750122070312 +201.80470275878906 +122.04000091552734 +219.0 +202.07850646972656 +121.75 +219.2899932861328 +202.15499877929688 +121.72879791259766 +219.75999450683594 +202.35000610351562 +121.81500244140625 +219.77000427246094 +203.0 +121.79499816894531 +220.42999267578125 +203.02999877929688 +121.2300033569336 +223.3699951171875 +205.13999938964844 +119.9800033569336 +223.52999877929688 +205.33999633789062 +120.2615966796875 +223.11000061035156 +204.75999450683594 +120.66020202636719 +222.80999755859375 +204.9199981689453 +120.23500061035156 +223.49000549316406 +205.4949951171875 +120.71510314941406 +223.4199981689453 +205.2100067138672 +120.69499969482422 +223.72999572753906 +205.6999969482422 +120.6449966430664 +224.07449340820312 +202.70010375976562 +115.11499786376953 +223.72000122070312 +203.31500244140625 +115.16500091552734 +223.6750030517578 +202.89999389648438 +114.03500366210938 +222.0800018310547 +201.7100067138672 +113.45999908447266 +221.8350067138672 +201.08999633789062 +113.6449966430664 +220.60000610351562 +200.47500610351562 +113.26499938964844 +221.39999389648438 +201.1479949951172 +113.69999694824219 +221.64999389648438 +202.8000030517578 +112.81500244140625 +222.8000946044922 +202.6300048828125 +113.55000305175781 +223.19500732421875 +202.5500030517578 +112.50499725341797 +223.10499572753906 +201.8000030517578 +111.69139862060547 +224.3699951171875 +202.3800048828125 +112.1449966430664 +224.7899932861328 +202.5500030517578 +112.66999816894531 +223.92999267578125 +201.36000061035156 +111.43000030517578 +219.91000366210938 +194.61000061035156 +109.27880096435547 +219.97999572753906 +194.82000732421875 +109.65499877929688 +218.69000244140625 +193.28500366210938 +109.58499908447266 +218.49000549316406 +192.3350067138672 +109.4749984741211 +219.0500030517578 +192.86990356445312 +110.01499938964844 +218.50999450683594 +192.60000610351562 +109.91000366210938 +217.8800048828125 +192.63999938964844 +109.63999938964844 +218.57000732421875 +184.72999572753906 +103.88999938964844 +219.1300048828125 +186.9792022705078 +105.1895980834961 +220.9199981689453 +188.7550048828125 +105.9800033569336 +219.8699951171875 +188.5959930419922 +105.72000122070312 +220.7949981689453 +189.8300018310547 +107.55010223388672 +221.22500610351562 +189.4250030517578 +107.23999786376953 +221.9949951171875 +190.2899932861328 +108.7699966430664 +221.5198974609375 +189.51499938964844 +107.12999725341797 +222.87989807128906 +192.22500610351562 +108.91089630126953 +222.52999877929688 +193.02000427246094 +109.4000015258789 +222.3385009765625 +192.13999938964844 +108.80120086669922 +221.5 +191.0 +107.71990203857422 +221.72999572753906 +191.3000030517578 +108.61129760742188 +223.13999938964844 +192.16000366210938 +110.1500015258789 +224.0399932861328 +192.17999267578125 +108.99859619140625 +224.47999572753906 +192.36500549316406 +110.25 +224.1300048828125 +195.77000427246094 +111.15239715576172 +224.72000122070312 +197.2353057861328 +111.23500061035156 +222.92999267578125 +194.61000061035156 +109.32499694824219 +223.66009521484375 +195.88999938964844 +109.6500015258789 +223.7899932861328 +195.9600067138672 +110.37999725341797 +205.63499450683594 +179.92999267578125 +105.1500015258789 +204.0500030517578 +180.11000061035156 +102.96990203857422 +206.05999755859375 +182.80999755859375 +103.66100311279297 +204.0050048828125 +181.052001953125 +103.0199966430664 +203.0 +179.77499389648438 +102.625 +202.1999969482422 +178.32000732421875 +102.66850280761719 +203.47000122070312 +178.5 +102.01000213623047 +195.27999877929688 +174.02000427246094 +94.60579681396484 +194.49000549316406 +176.28500366210938 +95.0999984741211 +192.80999755859375 +174.8699951171875 +93.82990264892578 +190.99000549316406 +174.77999877929688 +94.10009765625 +188.8800048828125 +174.4600067138672 +94.01000213623047 +190.22999572753906 +175.0850067138672 +95.16500091552734 +188.3800048828125 +170.97999572753906 +94.31999969482422 +182.39999389648438 +173.48500061035156 +93.61000061035156 +176.36000061035156 +170.88999938964844 +93.87999725341797 +178.13999938964844 +172.51499938964844 +95.87000274658203 +181.5399932861328 +174.77999877929688 +98.23290252685547 +180.3350067138672 +174.9600067138672 +97.41000366210938 +178.42129516601562 +173.8199005126953 +96.6500015258789 +181.58999633789062 +175.4499969482422 +97.70999908447266 +189.3300018310547 +182.20449829101562 +104.7300033569336 +184.08999633789062 +178.1510009765625 +102.05999755859375 +183.3300018310547 +177.16000366210938 +101.58499908447266 +175.02999877929688 +173.7274932861328 +98.77999877929688 +175.3300018310547 +173.9600067138672 +99.42990112304688 +172.88999938964844 +171.33999633789062 +96.31999969482422 +172.77000427246094 +171.08999633789062 +96.70999908447266 +178.41180419921875 +173.60499572753906 +99.97940063476562 +179.7550048828125 +171.68499755859375 +99.1688003540039 +179.58999633789062 +171.56500244140625 +99.44000244140625 +188.52499389648438 +181.27000427246094 +106.47000122070312 +190.8000030517578 +188.38999938964844 +112.02999877929688 +196.05999755859375 +189.33999633789062 +112.79000091552734 +198.85000610351562 +190.9499969482422 +114.25 +192.14500427246094 +184.59500122070312 +109.08000183105469 +188.8592071533203 +182.5800018310547 +107.8949966430664 +184.27000427246094 +176.49000549316406 +104.05000305175781 +188.00999450683594 +180.2550048828125 +106.47000122070312 +191.75999450683594 +182.8939971923828 +108.44400024414062 +189.98500061035156 +180.10000610351562 +106.44000244140625 +190.44000244140625 +181.0399932861328 +107.69999694824219 +189.92999267578125 +178.27999877929688 +107.69999694824219 +193.32000732421875 +179.52999877929688 +108.63999938964844 +195.80099487304688 +181.22250366210938 +109.44000244140625 +196.83070373535156 +182.88999938964844 +109.73999786376953 +197.5800018310547 +183.5749969482422 +110.3499984741211 +198.3419952392578 +184.47999572753906 +110.11000061035156 +198.02000427246094 +184.7899932861328 +110.69000244140625 +204.75 +184.97999572753906 +112.56700134277344 +203.60000610351562 +182.9499969482422 +111.33350372314453 +201.75 +180.57000732421875 +110.02999877929688 +203.86399841308594 +180.3800048828125 +110.44000244140625 +205.7899932861328 +181.67999267578125 +111.19999694824219 +205.7100067138672 +182.4199981689453 +111.3499984741211 +202.58999633789062 +182.08999633789062 +110.69999694824219 +200.8000030517578 +179.7906951904297 +111.01499938964844 +202.11500549316406 +180.9550018310547 +112.02999877929688 +203.0399932861328 +180.63999938964844 +113.26499938964844 +201.60440063476562 +179.1248016357422 +111.84010314941406 +201.76499938964844 +178.3531036376953 +112.12000274658203 +202.8000030517578 +178.98280334472656 +112.21009826660156 +202.1300048828125 +179.5800018310547 +112.0999984741211 +197.07000732421875 +176.64999389648438 +105.5199966430664 +198.35009765625 +178.67669677734375 +105.17510223388672 +196.91000366210938 +176.8300018310547 +103.91500091552734 +197.75999450683594 +176.69020080566406 +103.93499755859375 +194.55499267578125 +173.3000030517578 +102.18499755859375 +192.57000732421875 +171.6300048828125 +101.00499725341797 +194.3000030517578 +174.38999938964844 +104.5 +195.63999938964844 +172.9149932861328 +100.49500274658203 +196.0399932861328 +173.30999755859375 +100.39820098876953 +197.80499267578125 +173.83999633789062 +101.23500061035156 +196.6999969482422 +173.09500122070312 +100.8311996459961 +198.27999877929688 +174.1999969482422 +102.15630340576172 +197.24220275878906 +172.57000732421875 +101.21499633789062 +196.8699951171875 +172.58999633789062 +101.41000366210938 +192.1199951171875 +166.13999938964844 +95.83499908447266 +190.73500061035156 +166.82009887695312 +95.88999938964844 +191.1300048828125 +166.52999877929688 +95.80000305175781 +190.61399841308594 +165.63999938964844 +95.36859893798828 +190.82000732421875 +165.9290008544922 +95.58999633789062 +191.10499572753906 +165.85499572753906 +95.5999984741211 +193.08999633789062 +167.30999755859375 +96.80000305175781 +198.01499938964844 +171.88999938964844 +99.0199966430664 +198.8300018310547 +173.9199981689453 +98.8949966430664 +201.3800048828125 +176.58399963378906 +99.6500015258789 +198.5399932861328 +173.03500366210938 +98.1050033569336 +199.8917999267578 +173.0500946044922 +98.48500061035156 +198.6201934814453 +172.24989318847656 +97.70500183105469 +199.66000366210938 +173.1300048828125 +98.87999725341797 +206.80499267578125 +186.14999389648438 +104.18499755859375 +204.6300048828125 +183.2899932861328 +103.13700103759766 +204.11000061035156 +181.9613037109375 +103.36000061035156 +204.9499969482422 +181.9600067138672 +103.95999908447266 +204.48240661621094 +181.6300048828125 +103.71499633789062 +204.00999450683594 +180.85000610351562 +102.41999816894531 +204.36000061035156 +180.5399932861328 +102.53500366210938 +206.32000732421875 +183.72500610351562 +105.36869812011719 +205.9250030517578 +184.38319396972656 +105.34500122070312 +206.2899932861328 +185.02999877929688 +105.7489013671875 +206.90499877929688 +185.3000030517578 +106.29499816894531 +207.28900146484375 +185.81500244140625 +106.33470153808594 +207.09010314941406 +185.5399932861328 +105.7249984741211 +208.1999969482422 +186.47999572753906 +106.37999725341797 +206.63479614257812 +186.2100067138672 +107.54100036621094 +207.10000610351562 +187.11000061035156 +108.66000366210938 +208.63560485839844 +187.54730224609375 +109.4749984741211 +209.3701934814453 +188.66000366210938 +111.87000274658203 +208.50450134277344 +188.77149963378906 +110.83499908447266 +208.22000122070312 +189.38499450683594 +110.73500061035156 +209.22999572753906 +188.9499969482422 +110.95999908447266 +208.92999267578125 +188.42999267578125 +108.52519989013672 +207.9499969482422 +185.76150512695312 +106.5999984741211 +207.86000061035156 +185.0500030517578 +106.5509033203125 +208.13999938964844 +185.16000366210938 +106.27999877929688 +209.8699951171875 +186.2700958251953 +107.30000305175781 +210.5399932861328 +187.44000244140625 +108.19000244140625 +210.08999633789062 +187.6699981689453 +108.63999938964844 +210.9499969482422 +185.7949981689453 +108.52999877929688 +211.0399932861328 +186.2949981689453 +108.80979919433594 +210.48800659179688 +186.956298828125 +108.875 +210.36000061035156 +186.30999755859375 +108.73500061035156 +211.7227020263672 +187.94000244140625 +109.9801025390625 +211.3000030517578 +187.41000366210938 +109.4000015258789 +211.24000549316406 +187.39999389648438 +108.91999816894531 +209.32119750976562 +181.03790283203125 +105.98500061035156 +210.5449981689453 +181.72999572753906 +106.375 +210.58999633789062 +180.88499450683594 +106.05500030517578 +211.0800018310547 +181.69000244140625 +106.47000122070312 +210.71499633789062 +182.1300048828125 +107.19499969482422 +210.3446044921875 +181.7899932861328 +107.25499725341797 +212.49000549316406 +184.32000732421875 +108.7750015258789 +211.74000549316406 +189.19000244140625 +113.33000183105469 +212.8966064453125 +190.36000061035156 +114.32499694824219 +212.77999877929688 +189.55099487304688 +113.65180206298828 +212.50999450683594 +189.89010620117188 +113.5647964477539 +212.77999877929688 +189.94639587402344 +113.66999816894531 +212.94000244140625 +191.68499755859375 +113.0 +212.8300018310547 +189.8350067138672 +111.52999877929688 +206.72000122070312 +189.61000061035156 +113.90499877929688 +204.9008026123047 +189.32989501953125 +114.65010070800781 +205.0 +192.02859497070312 +114.74500274658203 +204.69900512695312 +190.8249969482422 +114.364501953125 +204.8800048828125 +190.94500732421875 +114.80000305175781 +204.75999450683594 +190.3699951171875 +114.47000122070312 +205.3000030517578 +190.0 +114.38999938964844 +198.77999877929688 +187.16940307617188 +113.24500274658203 +199.19960021972656 +187.625 +113.9198989868164 +199.9739990234375 +187.35000610351562 +113.78500366210938 +200.41000366210938 +187.4770050048828 +114.12999725341797 +200.9600067138672 +187.34759521484375 +114.37100219726562 +199.39999389648438 +186.8699951171875 +114.3740005493164 +198.77000427246094 +186.2100067138672 +113.80999755859375 +198.91000366210938 +186.64999389648438 +112.65499877929688 +199.03500366210938 +186.80999755859375 +113.06999969482422 +198.97999572753906 +186.40460205078125 +113.01789855957031 +199.4250030517578 +185.5449981689453 +112.91999816894531 +199.30499267578125 +185.9259033203125 +113.68000030517578 +199.70840454101562 +185.72999572753906 +114.2300033569336 +198.41000366210938 +184.97999572753906 +113.44499969482422 +199.22000122070312 +190.80999755859375 +113.48030090332031 +194.35069274902344 +187.98500061035156 +113.29499816894531 +194.8699951171875 +187.83770751953125 +113.67990112304688 +195.3000030517578 +188.993896484375 +113.94499969482422 +194.00999450683594 +187.74000549316406 +113.0000991821289 +194.32000732421875 +187.6199951171875 +113.23500061035156 +196.25 +188.77000427246094 +117.0199966430664 +195.82000732421875 +190.27000427246094 +117.23999786376953 +197.5399932861328 +191.66000366210938 +117.26000213623047 +199.24000549316406 +192.99839782714844 +118.04989624023438 +199.13999938964844 +193.76499938964844 +117.90489959716797 +198.63999938964844 +193.072998046875 +117.9749984741211 +199.55999755859375 +193.9199981689453 +118.54049682617188 +197.39999389648438 +192.13499450683594 +117.37000274658203 +198.360107421875 +192.25 +116.13159942626953 +198.42999267578125 +192.2100067138672 +116.37750244140625 +198.13499450683594 +192.42999267578125 +116.28500366210938 +198.13999938964844 +192.14999389648438 +116.43000030517578 +198.91000366210938 +192.33999633789062 +116.58000183105469 +198.77999877929688 +193.08999633789062 +116.7251968383789 +198.5399932861328 +193.0800018310547 +116.62069702148438 +209.16000366210938 +206.9550018310547 +120.86000061035156 +208.75999450683594 +206.86500549316406 +121.65139770507812 +208.72999572753906 +207.2801055908203 +122.37129974365234 +209.93499755859375 +208.24000549316406 +122.6614990234375 +210.77000427246094 +208.52000427246094 +122.73500061035156 +210.0500030517578 +207.97999572753906 +122.58499908447266 +210.8300018310547 +208.72000122070312 +122.98999786376953 +211.4499969482422 +214.48500061035156 +129.21499633789062 +211.38499450683594 +213.32000732421875 +129.8300018310547 +211.27999877929688 +213.94500732421875 +130.4600067138672 +211.7100067138672 +212.39999389648438 +130.8350067138672 +212.4600067138672 +212.05999755859375 +130.44500732421875 +213.22999572753906 +211.61830139160156 +130.21499633789062 +212.83999633789062 +211.19000244140625 +129.83999633789062 +213.2899932861328 +211.02000427246094 +132.66000366210938 +212.6199951171875 +211.75 +134.15499877929688 +212.2899932861328 +210.85000610351562 +134.97000122070312 +210.9600067138672 +209.8249969482422 +134.4600067138672 +211.3699951171875 +209.97900390625 +134.55999755859375 +211.3594970703125 +209.6300048828125 +134.88999938964844 +212.41000366210938 +210.24000549316406 +135.34710693359375 +210.27499389648438 +204.2100067138672 +133.27000427246094 +212.49639892578125 +204.470703125 +134.38499450683594 +211.64169311523438 +204.9385986328125 +135.2165985107422 +212.12010192871094 +205.52000427246094 +136.22000122070312 +210.6300048828125 +204.86000061035156 +135.36000061035156 +210.36000061035156 +204.2899932861328 +133.73500061035156 +211.45799255371094 +205.13999938964844 +134.89999389648438 +210.60000610351562 +205.52969360351562 +135.4250030517578 +210.0800018310547 +204.89999389648438 +134.86500549316406 +210.9550018310547 +205.3300018310547 +134.7949981689453 +211.11000061035156 +204.8596954345703 +135.82179260253906 +211.6199951171875 +204.97999572753906 +135.03500366210938 +211.72500610351562 +205.24000549316406 +135.08030700683594 +211.19000244140625 +205.55999755859375 +135.32000732421875 +206.61990356445312 +205.27000427246094 +135.28500366210938 +207.3300018310547 +205.3105926513672 +134.9250030517578 +208.48260498046875 +206.0050048828125 +135.22500610351562 +208.92999267578125 +206.26499938964844 +135.27499389648438 +208.02999877929688 +205.55499267578125 +135.0850067138672 +208.1273956298828 +205.55999755859375 +135.1199951171875 +208.75999450683594 +206.13999938964844 +135.49000549316406 +207.84500122070312 +203.83999633789062 +132.9499969482422 +207.63429260253906 +203.9091033935547 +133.77499389648438 +207.80999755859375 +203.87750244140625 +134.0845947265625 +207.3800048828125 +203.97000122070312 +134.10499572753906 +205.58999633789062 +203.30999755859375 +133.4499969482422 +206.27000427246094 +203.52000427246094 +133.81500244140625 +206.8699951171875 +204.1300048828125 +134.3800048828125 +205.80999755859375 +201.67860412597656 +134.0850067138672 +206.5800018310547 +202.9250030517578 +135.87579345703125 +205.63999938964844 +203.07000732421875 +137.0850067138672 +202.10000610351562 +200.82989501953125 +133.21499633789062 +202.3415069580078 +201.52000427246094 +132.84500122070312 +201.0301055908203 +200.62460327148438 +131.07870483398438 +202.05999755859375 +201.11599731445312 +131.72999572753906 +200.36000061035156 +202.50999450683594 +133.0399932861328 +200.9499969482422 +202.5865020751953 +132.8800048828125 +201.9499969482422 +203.4149932861328 +133.39500427246094 +201.88999938964844 +203.11000061035156 +133.51100158691406 +201.97000122070312 +204.1862030029297 +133.3350067138672 +202.61000061035156 +204.42979431152344 +133.918701171875 +201.3699951171875 +203.0800018310547 +132.78990173339844 +197.1699981689453 +201.03500366210938 +130.52999877929688 +196.5850067138672 +200.9199981689453 +130.97999572753906 +196.05020141601562 +201.24000549316406 +131.00999450683594 +196.6199951171875 +202.00900268554688 +131.9499969482422 +195.75 +201.86000061035156 +132.13499450683594 +195.46240234375 +201.375 +131.6239013671875 +195.33999633789062 +200.99000549316406 +131.30999755859375 +198.35000610351562 +205.02000427246094 +135.2917938232422 +199.36500549316406 +205.26010131835938 +135.2100067138672 +199.9949951171875 +205.8300018310547 +135.26199340820312 +199.95989990234375 +206.0449981689453 +135.60000610351562 +200.3699951171875 +205.8000030517578 +135.25160217285156 +200.29440307617188 +205.3300018310547 +135.13999938964844 +200.1999969482422 +205.9949951171875 +135.49000549316406 +200.75 +205.61000061035156 +135.26499938964844 +201.0449981689453 +205.63999938964844 +135.59190368652344 +201.10000610351562 +205.7050018310547 +135.9403076171875 +201.11000061035156 +205.55999755859375 +136.4499969482422 +200.85000610351562 +205.88999938964844 +136.6699981689453 +201.12860107421875 +205.5399932861328 +136.8300018310547 +200.4199981689453 +204.7949981689453 +134.8115997314453 +201.13999938964844 +207.10000610351562 +140.61929321289062 +200.74000549316406 +206.94000244140625 +141.66000366210938 +199.4199981689453 +205.97999572753906 +140.57020568847656 +199.97500610351562 +206.41000366210938 +139.875 +199.0399932861328 +204.52000427246094 +138.44419860839844 +199.13929748535156 +205.2899932861328 +138.91000366210938 +199.9499969482422 +205.68499755859375 +139.17999267578125 +199.24000549316406 +205.07000732421875 +137.36000061035156 +199.30999755859375 +204.6829071044922 +136.10499572753906 +197.71499633789062 +202.80999755859375 +133.58999633789062 +198.0850067138672 +202.6750030517578 +134.46229553222656 +199.1199951171875 +203.875 +134.77999877929688 +200.05059814453125 +204.89349365234375 +135.26499938964844 +200.66000366210938 +204.66000366210938 +134.83999633789062 +200.52999877929688 +204.32530212402344 +136.66009521484375 +200.7100067138672 +205.0800018310547 +136.45989990234375 +201.02999877929688 +205.22999572753906 +137.4075927734375 +200.860107421875 +205.7100067138672 +137.57000732421875 +201.45399475097656 +206.18739318847656 +138.03140258789062 +201.66000366210938 +206.83999633789062 +137.625 +201.8000030517578 +206.7100067138672 +137.3699951171875 +201.74000549316406 +207.68299865722656 +141.3000030517578 +202.5 +207.00999450683594 +141.8199005126953 +203.05499267578125 +207.47999572753906 +141.56500244140625 +203.31460571289062 +207.67999267578125 +141.61500549316406 +203.09170532226562 +206.34249877929688 +141.15980529785156 +203.17999267578125 +205.65249633789062 +141.4499969482422 +203.33999633789062 +205.77999877929688 +141.27000427246094 +205.13999938964844 +206.19000244140625 +140.98500061035156 +204.08999633789062 +205.97999572753906 +141.3249969482422 +202.8300018310547 +206.47000122070312 +140.51010131835938 +203.4149932861328 +207.56539916992188 +140.7899932861328 +203.1199951171875 +207.843505859375 +141.61880493164062 +203.19000244140625 +207.7449951171875 +141.6699981689453 +202.88699340820312 +207.24000549316406 +141.83009338378906 +202.4499969482422 +209.80990600585938 +141.97830200195312 +204.54379272460938 +212.55499267578125 +143.0388946533203 +203.13999938964844 +210.9499969482422 +143.0050048828125 +202.60009765625 +210.8800048828125 +141.57870483398438 +202.2104034423828 +209.59649658203125 +140.71499633789062 +200.72999572753906 +208.4949951171875 +139.59010314941406 +200.5500030517578 +207.85000610351562 +139.9499969482422 +203.66000366210938 +211.0399932861328 +141.64500427246094 +203.17990112304688 +211.28860473632812 +141.69500732421875 +202.625 +211.98500061035156 +142.25999450683594 +203.58999633789062 +212.31759643554688 +142.11500549316406 +204.98500061035156 +212.9134979248047 +142.36500549316406 +204.6999969482422 +212.88999938964844 +142.07179260253906 +203.92999267578125 +213.52000427246094 +141.69000244140625 +205.32000732421875 +214.6699981689453 +144.375 +204.52999877929688 +214.8699951171875 +143.1800994873047 +203.92880249023438 +215.7899932861328 +142.22500610351562 +200.72000122070312 +216.97000122070312 +142.77000427246094 +201.4600067138672 +217.1199951171875 +142.83990478515625 +201.25 +217.22000122070312 +142.77499389648438 +201.44000244140625 +216.9199981689453 +142.5500030517578 +202.8699951171875 +216.30999755859375 +142.8000030517578 +203.31500244140625 +215.6226043701172 +142.68699645996094 +202.53880310058594 +216.12879943847656 +143.11500549316406 +201.75999450683594 +216.2100067138672 +142.65499877929688 +201.6999969482422 +215.77999877929688 +143.11990356445312 +202.82000732421875 +216.94000244140625 +144.0 +202.75 +217.56900024414062 +143.9499969482422 +202.76010131835938 +217.59249877929688 +144.477294921875 +200.94000244140625 +216.7550048828125 +144.1501007080078 +200.2071075439453 +215.61000061035156 +143.37989807128906 +200.91000366210938 +215.80999755859375 +143.7100067138672 +199.23919677734375 +213.42999267578125 +142.4716033935547 +198.97999572753906 +213.2100067138672 +142.39999389648438 +198.85000610351562 +213.17100524902344 +142.83999633789062 +198.0666961669922 +212.8300018310547 +144.06500244140625 +198.14999389648438 +212.53030395507812 +144.45120239257812 +198.58999633789062 +213.37989807128906 +144.4499969482422 +199.25999450683594 +212.7050018310547 +144.3300018310547 +198.75 +213.02000427246094 +144.47500610351562 +198.88499450683594 +212.97000122070312 +144.7550048828125 +199.1999969482422 +213.24000549316406 +145.0 +196.15499877929688 +209.9149932861328 +141.1999969482422 +197.50999450683594 +212.7899932861328 +142.91650390625 +197.27000427246094 +213.72999572753906 +143.0749969482422 +197.27000427246094 +213.2458953857422 +142.65499877929688 +196.2779998779297 +212.4149932861328 +141.60000610351562 +196.22000122070312 +211.55999755859375 +141.5050048828125 +196.4499969482422 +212.10000610351562 +141.9600067138672 +198.42999267578125 +214.66000366210938 +144.47999572753906 +197.31500244140625 +216.02999877929688 +145.4698028564453 +197.0800018310547 +215.27999877929688 +145.9550018310547 +197.875 +215.8350067138672 +145.625 +197.9886932373047 +215.7550048828125 +145.22999572753906 +198.2449951171875 +216.3000030517578 +144.97000122070312 +198.3699951171875 +216.16000366210938 +144.6699981689453 +197.5800018310547 +215.97999572753906 +144.3986053466797 +197.5800018310547 +216.22999572753906 +144.50999450683594 +197.61500549316406 +216.80999755859375 +145.02000427246094 +196.52000427246094 +216.01010131835938 +144.8300018310547 +195.4600067138672 +214.9499969482422 +144.17999267578125 +195.83999633789062 +215.0800018310547 +144.27609252929688 +195.63999938964844 +214.80999755859375 +144.0399932861328 +197.06019592285156 +217.75840759277344 +145.22000122070312 +196.94000244140625 +216.6199951171875 +144.99000549316406 +196.9508056640625 +215.39990234375 +145.27999877929688 +196.05999755859375 +214.8350067138672 +145.13499450683594 +195.91000366210938 +215.1999969482422 +145.0500030517578 +195.63999938964844 +214.54010009765625 +144.17990112304688 +196.25 +212.55499267578125 +145.47000122070312 +198.67999267578125 +210.69000244140625 +144.625 +197.6699981689453 +210.08999633789062 +143.89990234375 +198.49000549316406 +209.91000366210938 +143.9550018310547 +198.32000732421875 +209.30999755859375 +143.48500061035156 +199.80999755859375 +209.98500061035156 +144.15499877929688 +199.92999267578125 +208.66000366210938 +143.78990173339844 +200.94000244140625 +209.60459899902344 +143.77999877929688 +201.37179565429688 +209.85000610351562 +143.6300048828125 +200.52999877929688 +208.87210083007812 +143.80999755859375 +200.1396026611328 +208.63999938964844 +142.92999267578125 +201.43899536132812 +209.5 +144.4058074951172 +201.69000244140625 +209.27499389648438 +143.90989685058594 +201.36019897460938 +209.0850067138672 +143.84500122070312 +201.5500030517578 +208.47999572753906 +144.1750030517578 +200.9822998046875 +212.67999267578125 +147.02000427246094 +201.3800048828125 +213.4199981689453 +146.90499877929688 +202.4499969482422 +213.40499877929688 +147.1649932861328 +201.9600067138672 +213.74319458007812 +147.19500732421875 +201.57000732421875 +213.5699005126953 +147.35009765625 +201.52999877929688 +213.55999755859375 +147.22850036621094 +200.2899932861328 +212.77000427246094 +147.8300018310547 +202.44000244140625 +213.8699951171875 +152.2050018310547 +202.10000610351562 +213.76980590820312 +152.0500030517578 +201.8699951171875 +212.88499450683594 +152.14129638671875 +201.13999938964844 +212.2100067138672 +153.89999389648438 +201.01539611816406 +211.60000610351562 +153.9322967529297 +201.15980529785156 +211.7667999267578 +153.75439453125 +201.60000610351562 +212.05999755859375 +154.30999755859375 +199.75 +213.32000732421875 +156.44859313964844 +199.69000244140625 +216.06500244140625 +154.95989990234375 +200.122802734375 +215.8699951171875 +155.625 +200.24000549316406 +216.1750030517578 +156.02999877929688 +200.97999572753906 +217.72999572753906 +156.0850067138672 +201.1750030517578 +216.95399475097656 +155.46429443359375 +200.94000244140625 +217.1300048828125 +155.0800018310547 +201.58009338378906 +220.00999450683594 +157.42010498046875 +201.38180541992188 +219.63499450683594 +157.91009521484375 +201.99000549316406 +219.6750030517578 +157.69000244140625 +202.0800018310547 +219.16000366210938 +157.48500061035156 +201.44000244140625 +217.4600067138672 +156.30499267578125 +201.125 +219.7050018310547 +156.47000122070312 +201.10000610351562 +223.2100067138672 +157.75 +201.00990295410156 +221.7899932861328 +157.10000610351562 +199.97000122070312 +221.40330505371094 +157.04989624023438 +200.3249969482422 +219.6649932861328 +157.7100067138672 +200.15499877929688 +219.86500549316406 +157.82550048828125 +200.69500732421875 +219.5800018310547 +157.57989501953125 +206.58560180664062 +219.80999755859375 +157.94500732421875 +205.1199951171875 +219.39999389648438 +157.8699951171875 +209.54010009765625 +219.5 +154.6300048828125 +207.9499969482422 +219.7270050048828 +152.88499450683594 +207.875 +219.2100067138672 +153.39500427246094 +208.08999633789062 +220.67739868164062 +154.27499389648438 +208.2100067138672 +220.8502960205078 +154.35169982910156 +208.19000244140625 +221.6999969482422 +153.72999572753906 +207.86000061035156 +220.4499969482422 +153.27999877929688 +212.3000030517578 +220.3000030517578 +156.08140563964844 +211.47500610351562 +220.6199951171875 +156.36500549316406 +210.92030334472656 +220.9300994873047 +157.093505859375 +210.81809997558594 +220.30499267578125 +157.2053985595703 +211.58999633789062 +220.2501983642578 +156.9550018310547 +211.94500732421875 +219.88999938964844 +156.8874969482422 +212.41000366210938 +219.8800048828125 +157.24000549316406 +213.73500061035156 +221.8300018310547 +160.6300048828125 +213.8800048828125 +222.7093048095703 +159.80499267578125 +214.10000610351562 +222.99960327148438 +159.37969970703125 +212.36000061035156 +223.89999389648438 +158.30999755859375 +212.0399932861328 +223.8699951171875 +158.27999877929688 +210.8365020751953 +223.05499267578125 +158.22000122070312 +209.67039489746094 +222.9499969482422 +158.3188018798828 +208.94039916992188 +222.50999450683594 +157.8249969482422 +209.4499969482422 +223.2100067138672 +158.3000946044922 +209.94000244140625 +223.47999572753906 +158.24000549316406 +209.27999877929688 +221.1300048828125 +159.07000732421875 +209.87069702148438 +219.77999877929688 +159.0800018310547 +210.8300018310547 +220.94000244140625 +159.72999572753906 +209.8350067138672 +220.55999755859375 +159.5850067138672 +209.94500732421875 +220.47000122070312 +159.5399932861328 +209.60499572753906 +219.69500732421875 +159.89500427246094 +210.03500366210938 +219.33999633789062 +160.00010681152344 +209.91000366210938 +222.88999938964844 +163.06869506835938 +207.80499267578125 +222.3699951171875 +163.35000610351562 +207.8000030517578 +222.39999389648438 +163.27000427246094 +208.9156036376953 +222.61329650878906 +162.56500244140625 +209.7324981689453 +222.41000366210938 +162.81500244140625 +209.88999938964844 +222.58070373535156 +162.85000610351562 +211.11000061035156 +222.47000122070312 +162.8300018310547 +212.00999450683594 +220.25999450683594 +162.41000366210938 +212.97999572753906 +221.63470458984375 +162.59669494628906 +212.0800018310547 +222.0850067138672 +163.2747039794922 +212.6199951171875 +222.2899932861328 +163.44769287109375 +212.60000610351562 +222.60000610351562 +163.72999572753906 +212.5749969482422 +222.05999755859375 +164.05999755859375 +212.4199981689453 +222.27999877929688 +164.10499572753906 +211.7899932861328 +224.37559509277344 +167.35989379882812 +210.8249969482422 +224.52999877929688 +166.4949951171875 +210.63499450683594 +225.26010131835938 +166.47869873046875 +211.1649932861328 +225.5800018310547 +166.1822967529297 +211.40499877929688 +226.10000610351562 +165.68150329589844 +211.16000366210938 +225.7899932861328 +165.09500122070312 +211.0749969482422 +224.99000549316406 +164.8800048828125 +208.02999877929688 +225.30560302734375 +163.72000122070312 +208.76499938964844 +225.8800048828125 +164.75469970703125 +208.8406982421875 +225.9949951171875 +164.97000122070312 +209.0 +225.7550048828125 +165.08009338378906 +209.0 +225.4499969482422 +164.82000732421875 +209.1999053955078 +225.33349609375 +164.40330505371094 +208.5399932861328 +225.6300048828125 +164.07000732421875 +210.1699981689453 +226.86000061035156 +171.57839965820312 +211.42999267578125 +226.67999267578125 +171.38499450683594 +210.67999267578125 +226.60000610351562 +171.38499450683594 +210.67269897460938 +225.9600067138672 +170.52499389648438 +211.375 +226.8350067138672 +170.91180419921875 +210.17999267578125 +226.2969970703125 +170.1999053955078 +209.00999450683594 +226.3000030517578 +170.5500030517578 +212.0850067138672 +225.27999877929688 +169.96490478515625 +210.1199951171875 +224.2050018310547 +170.37860107421875 +209.58999633789062 +223.36000061035156 +170.39500427246094 +210.35000610351562 +223.02999877929688 +170.9022979736328 +210.0384979248047 +223.1999969482422 +171.0050048828125 +210.3249969482422 +223.19000244140625 +170.77999877929688 +210.22000122070312 +223.1699981689453 +171.33999633789062 +209.9499969482422 +222.6204071044922 +172.92999267578125 +210.44000244140625 +223.75999450683594 +173.11500549316406 +211.38999938964844 +223.67999267578125 +173.860107421875 +210.9550018310547 +223.72000122070312 +173.72000122070312 +211.27999877929688 +223.94000244140625 +173.2989959716797 +210.9949951171875 +223.98500061035156 +173.28500366210938 +210.06100463867188 +223.99000549316406 +173.1114044189453 +209.9542999267578 +223.3699951171875 +172.08999633789062 +210.85000610351562 +224.52000427246094 +172.16009521484375 +211.00999450683594 +224.8699951171875 +172.15469360351562 +211.19000244140625 +225.9250030517578 +172.64999389648438 +210.93499755859375 +225.96499633789062 +172.4149932861328 +210.9499969482422 +225.9149932861328 +172.07000732421875 +211.22000122070312 +226.1199951171875 +172.38999938964844 +214.64500427246094 +227.94000244140625 +173.08009338378906 +213.47000122070312 +227.75 +172.6981964111328 +213.31959533691406 +228.4600067138672 +172.02940368652344 +213.67999267578125 +228.93089294433594 +172.55479431152344 +213.25999450683594 +229.35000610351562 +172.70480346679688 +212.5800018310547 +229.25990295410156 +171.9600067138672 +212.5399932861328 +229.30999755859375 +171.4600067138672 +213.2655029296875 +227.25 +166.0847930908203 +213.477294921875 +226.9600067138672 +167.86000061035156 +213.27999877929688 +226.44540405273438 +167.5509033203125 +214.41119384765625 +227.50999450683594 +168.26499938964844 +213.7100067138672 +227.22000122070312 +167.90029907226562 +214.18499755859375 +227.82000732421875 +167.88499450683594 +214.38999938964844 +227.52000427246094 +167.00999450683594 +212.9351043701172 +227.96499633789062 +169.1300048828125 +213.14999389648438 +227.38999938964844 +169.52330017089844 +213.5 +227.69000244140625 +168.6199951171875 +214.125 +228.2906951904297 +169.03500366210938 +214.40499877929688 +228.37899780273438 +170.65750122070312 +214.13999938964844 +228.10000610351562 +170.7100067138672 +214.30999755859375 +228.27000427246094 +170.8300018310547 +214.4600067138672 +230.85000610351562 +172.08999633789062 +215.25999450683594 +232.03500366210938 +172.67849731445312 +214.33999633789062 +232.00999450683594 +172.94500732421875 +214.7899932861328 +232.0050048828125 +173.43240356445312 +214.73500061035156 +232.24000549316406 +173.4550018310547 +214.80999755859375 +231.97999572753906 +173.6501007080078 +213.75999450683594 +232.24899291992188 +173.77999877929688 +214.58529663085938 +231.42140197753906 +174.46189880371094 +214.50999450683594 +232.125 +174.06809997558594 +214.3896026611328 +232.25 +174.3800048828125 +214.1699981689453 +231.7550048828125 +173.8843994140625 +213.88999938964844 +231.7899932861328 +173.64999389648438 +213.5 +231.74249267578125 +173.7949981689453 +213.9600067138672 +231.4499969482422 +173.49000549316406 +214.52000427246094 +233.47000122070312 +174.9250030517578 +214.43499755859375 +233.22000122070312 +174.92999267578125 +214.5399932861328 +232.75999450683594 +175.0299072265625 +213.64500427246094 +232.82000732421875 +175.2100067138672 +213.8000030517578 +232.9199981689453 +175.47500610351562 +213.42999267578125 +232.5854949951172 +176.15499877929688 +214.0399932861328 +232.80999755859375 +176.75 +213.0500030517578 +231.51499938964844 +178.13999938964844 +211.89999389648438 +230.69970703125 +175.85989379882812 +212.0 +231.1750030517578 +176.33999633789062 +212.1999969482422 +231.6999969482422 +176.19529724121094 +211.9600067138672 +231.28500366210938 +176.2050018310547 +211.88999938964844 +231.31149291992188 +175.8249969482422 +211.35000610351562 +231.0 +175.50999450683594 +210.61000061035156 +230.32000732421875 +178.4600067138672 +209.71499633789062 +230.13999938964844 +178.26519775390625 +210.1199951171875 +230.47999572753906 +178.80499267578125 +209.75650024414062 +230.35499572753906 +179.00669860839844 +209.85499572753906 +230.66000366210938 +179.55499267578125 +208.52000427246094 +229.49000549316406 +178.58999633789062 +209.02000427246094 +230.25999450683594 +179.2899932861328 +208.8424072265625 +232.5399932861328 +181.57000732421875 +208.28280639648438 +233.1699981689453 +179.889892578125 +208.95449829101562 +236.30999755859375 +181.3780059814453 +208.6649932861328 +234.4550018310547 +179.02000427246094 +208.61000061035156 +234.3699951171875 +177.36500549316406 +208.5699005126953 +233.4499969482422 +177.41969299316406 +207.61000061035156 +234.11000061035156 +177.85000610351562 +205.36000061035156 +219.09500122070312 +174.97500610351562 +203.44000244140625 +215.27499389648438 +174.77999877929688 +202.75 +216.05999755859375 +175.82000732421875 +201.9824981689453 +214.33999633789062 +173.10989379882812 +203.5500030517578 +214.24920654296875 +173.2799072265625 +203.19000244140625 +214.8800048828125 +173.75 +202.27000427246094 +214.80999755859375 +173.58999633789062 +206.75999450683594 +213.38999938964844 +177.9499969482422 +205.77000427246094 +211.75100708007812 +177.8498992919922 +203.93499755859375 +213.3509979248047 +178.9250030517578 +204.14999389648438 +212.7899932861328 +179.02999877929688 +203.42999267578125 +212.42739868164062 +179.27000427246094 +202.3249969482422 +212.44000244140625 +179.31390380859375 +203.33999633789062 +211.72000122070312 +179.97000122070312 +204.52999877929688 +214.69000244140625 +178.24000549316406 +204.6300048828125 +214.97999572753906 +176.88499450683594 +203.7100067138672 +215.3800048828125 +177.92999267578125 +204.03500366210938 +215.07000732421875 +178.02999877929688 +203.8699951171875 +214.14999389648438 +178.50999450683594 +203.3350067138672 +213.86000061035156 +178.77520751953125 +202.92999267578125 +213.80999755859375 +178.25999450683594 +210.75999450683594 +215.47000122070312 +178.0399932861328 +214.22500610351562 +217.50999450683594 +178.14999389648438 +214.49989318847656 +218.6750030517578 +178.23500061035156 +214.5399932861328 +220.80999755859375 +178.42999267578125 +214.6024932861328 +221.44500732421875 +179.22999572753906 +213.875 +221.1999969482422 +179.6649932861328 +213.25 +222.3300018310547 +179.41000366210938 +218.27000427246094 +224.6300048828125 +182.47999572753906 +219.62899780273438 +223.1903076171875 +181.52999877929688 +219.9149932861328 +222.78970336914062 +181.14999389648438 +218.7100067138672 +221.66990661621094 +179.97000122070312 +219.5 +221.39999389648438 +179.42010498046875 +219.3000946044922 +221.47999572753906 +179.47000122070312 +220.1300048828125 +223.1750030517578 +180.8699951171875 +222.7816925048828 +222.6197052001953 +182.19500732421875 +224.36000061035156 +222.8863067626953 +183.01499938964844 +228.1999969482422 +222.52999877929688 +182.90809631347656 +228.6750030517578 +222.4499969482422 +181.88499450683594 +229.2899932861328 +222.0850067138672 +182.61500549316406 +228.8300018310547 +222.44000244140625 +182.69500732421875 +229.3699951171875 +222.69000244140625 +182.75 +226.77499389648438 +221.52000427246094 +183.3455047607422 +227.47000122070312 +221.72000122070312 +183.1800994873047 +228.72999572753906 +222.11500549316406 +183.73500061035156 +228.10000610351562 +221.67999267578125 +183.23550415039062 +227.73500061035156 +220.72999572753906 +182.89999389648438 +227.64999389648438 +221.23500061035156 +182.16000366210938 +227.2050018310547 +221.3699951171875 +182.0850067138672 +228.57000732421875 +220.82000732421875 +180.92999267578125 +229.72999572753906 +221.08999633789062 +182.0146942138672 +229.77999877929688 +221.67999267578125 +182.27499389648438 +229.77499389648438 +222.1199951171875 +182.24000549316406 +229.57000732421875 +221.9698944091797 +183.06500244140625 +229.18299865722656 +221.86500549316406 +182.7845001220703 +229.64999389648438 +221.44000244140625 +183.10000610351562 +231.80999755859375 +222.60000610351562 +181.41099548339844 +232.2899932861328 +224.2010040283203 +180.13180541992188 +233.09500122070312 +224.32000732421875 +180.0500030517578 +232.4550018310547 +224.64999389648438 +180.99000549316406 +232.9250030517578 +224.08999633789062 +181.32989501953125 +233.5850067138672 +224.38499450683594 +181.26499938964844 +233.3300018310547 +224.55499267578125 +181.57000732421875 +232.2100067138672 +229.3350067138672 +182.5800018310547 +231.74020385742188 +228.6009979248047 +181.3800048828125 +232.00999450683594 +230.4550018310547 +181.14349365234375 +232.92730712890625 +232.14999389648438 +182.1649932861328 +232.72999572753906 +232.47000122070312 +181.52499389648438 +232.94500732421875 +231.3699951171875 +181.9600067138672 +232.8300018310547 +230.88999938964844 +182.0 +232.1699981689453 +232.2301025390625 +179.92010498046875 +231.07000732421875 +231.39999389648438 +179.5050048828125 +230.74000549316406 +230.00999450683594 +178.92999267578125 +230.57000732421875 +230.19000244140625 +179.70010375976562 +230.85000610351562 +230.41000366210938 +180.17999267578125 +231.36000061035156 +230.76499938964844 +179.97000122070312 +231.64999389648438 +231.05999755859375 +180.44000244140625 +230.66000366210938 +230.2899932861328 +182.67999267578125 +230.86000061035156 +230.16009521484375 +181.1519012451172 +230.67999267578125 +230.3000030517578 +181.7657928466797 +231.07000732421875 +230.8197021484375 +181.49920654296875 +231.14500427246094 +230.60000610351562 +181.76210021972656 +231.22500610351562 +231.3249969482422 +182.19500732421875 +230.8800048828125 +231.4199981689453 +181.97999572753906 +231.8300018310547 +228.76010131835938 +178.66490173339844 +231.32260131835938 +228.72000122070312 +178.27749633789062 +231.30990600585938 +228.55999755859375 +177.53990173339844 +230.625 +228.07000732421875 +176.69509887695312 +230.0500030517578 +227.99000549316406 +176.5749053955078 +230.18499755859375 +227.50999450683594 +176.33250427246094 +230.5399932861328 +228.02000427246094 +175.64999389648438 +226.7200927734375 +222.47500610351562 +170.30999755859375 +227.3350067138672 +223.3699951171875 +172.4250030517578 +227.1345977783203 +224.14999389648438 +174.0500030517578 +226.2949981689453 +224.2100067138672 +173.47500610351562 +225.99009704589844 +223.32000732421875 +172.8249969482422 +226.44500732421875 +223.97500610351562 +174.5800018310547 +225.9600067138672 +223.80999755859375 +175.38999938964844 +225.57989501953125 +222.3074951171875 +176.47500610351562 +225.1300048828125 +221.58999633789062 +174.96499633789062 +224.8300018310547 +221.25999450683594 +174.22569274902344 +224.1750030517578 +220.9499969482422 +174.26499938964844 +224.22999572753906 +221.6750030517578 +174.7449951171875 +224.8800048828125 +222.02000427246094 +174.80189514160156 +224.91000366210938 +221.9499969482422 +174.9709930419922 +227.9499969482422 +225.3625030517578 +176.32000732421875 +228.05999755859375 +227.7008056640625 +178.1300048828125 +227.16929626464844 +226.87139892578125 +177.00579833984375 +228.61000061035156 +227.55999755859375 +178.2949981689453 +227.8699951171875 +228.1300048828125 +178.11500549316406 +227.85000610351562 +228.8300018310547 +178.0601043701172 +227.75 +228.83999633789062 +178.02000427246094 +228.80999755859375 +228.52000427246094 +178.99000549316406 +228.56500244140625 +229.42010498046875 +181.22140502929688 +228.5399932861328 +228.26300048828125 +181.5240936279297 +228.43499755859375 +228.3350067138672 +181.0 +227.88499450683594 +228.50990295410156 +181.33990478515625 +227.59840393066406 +228.77000427246094 +181.03500366210938 +227.14999389648438 +227.89500427246094 +179.83999633789062 +226.5 +227.94500732421875 +180.97999572753906 +226.9615936279297 +228.03500366210938 +180.8800048828125 +227.57049560546875 +228.1804962158203 +181.68499755859375 +228.11160278320312 +227.85000610351562 +181.6199951171875 +228.3592071533203 +227.7989044189453 +181.81500244140625 +228.56820678710938 +228.2949981689453 +182.02549743652344 +229.3000030517578 +228.72000122070312 +181.6999969482422 +230.01499938964844 +229.15989685058594 +181.05999755859375 +229.5740966796875 +228.8249969482422 +181.58999633789062 +229.8699951171875 +228.69000244140625 +181.40420532226562 +229.83999633789062 +228.7050018310547 +181.93499755859375 +230.625 +229.10000610351562 +182.22259521484375 +230.13250732421875 +228.64999389648438 +181.6645965576172 +230.44000244140625 +229.0500030517578 +181.60000610351562 +230.41580200195312 +229.9969940185547 +177.69500732421875 +230.9499969482422 +231.7050018310547 +179.156494140625 +232.2899932861328 +232.42999267578125 +179.69000244140625 +233.0 +231.6790008544922 +179.91419982910156 +232.91920471191406 +232.02499389648438 +180.82969665527344 +232.97500610351562 +231.61000061035156 +180.0800018310547 +232.49000549316406 +231.55999755859375 +180.1999969482422 +232.80960083007812 +229.6649932861328 +175.06500244140625 +232.9600067138672 +228.92999267578125 +174.77499389648438 +232.5 +228.50999450683594 +174.14999389648438 +232.02999877929688 +228.4499969482422 +173.52000427246094 +232.17999267578125 +228.66000366210938 +173.55670166015625 +232.3542938232422 +228.93499755859375 +174.0399932861328 +232.27000427246094 +229.0500030517578 +174.27999877929688 +230.60000610351562 +224.9600067138672 +170.63360595703125 +227.82899475097656 +223.25 +169.05999755859375 +227.85000610351562 +223.74859619140625 +167.93499755859375 +228.41000366210938 +225.02999877929688 +169.23500061035156 +228.39999389648438 +225.16000366210938 +169.1981964111328 +228.94000244140625 +225.52000427246094 +170.2949981689453 +229.7100067138672 +225.3300018310547 +170.75 +236.8300018310547 +226.42999267578125 +171.35000610351562 +236.01100158691406 +225.61000061035156 +170.70590209960938 +236.49000549316406 +225.6407928466797 +171.52499389648438 +237.4272003173828 +225.625 +170.7834930419922 +236.91000366210938 +224.7100067138672 +169.36000061035156 +237.15499877929688 +224.8800048828125 +169.36500549316406 +238.49000549316406 +226.0 +170.6300048828125 +237.69000244140625 +233.1999969482422 +170.8614959716797 +237.39999389648438 +233.41000366210938 +170.8000030517578 +237.16000366210938 +233.51499938964844 +170.46420288085938 +238.0399932861328 +234.4199981689453 +170.4499969482422 +238.05999755859375 +235.1699981689453 +170.41220092773438 +238.70449829101562 +234.95010375976562 +170.90499877929688 +239.7100067138672 +235.69000244140625 +171.64999389648438 +239.28500366210938 +234.0762939453125 +165.13729858398438 +239.80499267578125 +233.03500366210938 +166.08999633789062 +238.77000427246094 +233.72000122070312 +166.36549377441406 +239.625 +232.97999572753906 +166.5850067138672 +239.1199951171875 +232.9499969482422 +166.76010131835938 +239.9250030517578 +232.87669372558594 +167.09500122070312 +239.6699981689453 +232.32000732421875 +167.0399932861328 +239.22999572753906 +235.36000061035156 +170.25999450683594 +238.6999969482422 +237.33009338378906 +169.9698944091797 +237.72999572753906 +236.60000610351562 +170.1649932861328 +237.80580139160156 +236.1342010498047 +169.86500549316406 +237.1649932861328 +236.50010681152344 +169.71499633789062 +237.11000061035156 +236.1699981689453 +169.14500427246094 +237.9199981689453 +235.86000061035156 +168.3699951171875 +236.3101043701172 +235.8800048828125 +168.0800018310547 +236.22500610351562 +236.17999267578125 +167.7550048828125 +236.0 +237.19000244140625 +168.7050018310547 +237.75 +237.76499938964844 +168.0850067138672 +234.52859497070312 +237.8000030517578 +168.2449951171875 +234.30999755859375 +238.23500061035156 +170.23989868164062 +234.35000610351562 +238.22999572753906 +170.7584991455078 +228.10800170898438 +233.86000061035156 +177.64999389648438 +227.0399932861328 +232.5850067138672 +178.61419677734375 +227.7386016845703 +231.7100067138672 +177.99000549316406 +226.80499267578125 +231.56460571289062 +178.00509643554688 +227.05999755859375 +231.1699981689453 +176.27499389648438 +226.18499755859375 +229.64199829101562 +176.72500610351562 +226.77999877929688 +230.36000061035156 +177.3300018310547 +228.94000244140625 +229.61000061035156 +177.2550048828125 +228.74000549316406 +230.94000244140625 +178.09500122070312 +228.61000061035156 +230.8498992919922 +177.55810546875 +229.47250366210938 +231.27000427246094 +177.0941925048828 +229.4600067138672 +231.22999572753906 +177.5749969482422 +229.85000610351562 +230.08270263671875 +177.1199951171875 +230.02000427246094 +229.9550018310547 +177.08999633789062 +234.07000732421875 +229.0500030517578 +177.77499389648438 +234.09500122070312 +229.0500030517578 +177.6750030517578 +233.9694061279297 +228.6750030517578 +178.11000061035156 +233.23500061035156 +228.52999877929688 +177.52499389648438 +233.5399932861328 +227.6300048828125 +177.4700927734375 +233.77549743652344 +227.7635955810547 +177.68499755859375 +234.05999755859375 +228.11000061035156 +177.7899932861328 +236.21499633789062 +231.06500244140625 +175.48899841308594 +236.82000732421875 +232.84970092773438 +177.02169799804688 +236.57000732421875 +231.95030212402344 +177.5850067138672 +235.75999450683594 +231.3350067138672 +177.27000427246094 +235.63999938964844 +231.5399932861328 +177.52499389648438 +235.97000122070312 +231.2624053955078 +177.19500732421875 +236.75999450683594 +231.44000244140625 +177.77999877929688 +239.52999877929688 +235.1898956298828 +176.31500244140625 +239.5928955078125 +235.64500427246094 +176.13999938964844 +239.19500732421875 +235.4149932861328 +175.26499938964844 +239.08560180664062 +234.8300018310547 +175.14999389648438 +238.92999267578125 +234.91000366210938 +174.77499389648438 +238.93829345703125 +234.41000366210938 +174.75 +238.13999938964844 +234.02000427246094 +174.8300018310547 +239.6300048828125 +230.41000366210938 +170.1199951171875 +239.47999572753906 +230.25999450683594 +170.40499877929688 +239.67430114746094 +230.96429443359375 +169.87840270996094 +239.52000427246094 +231.08999633789062 +170.23500061035156 +239.55999755859375 +231.37989807128906 +170.19580078125 +239.2628936767578 +231.41000366210938 +171.18850708007812 +238.97000122070312 +231.63999938964844 +170.2100067138672 +237.55999755859375 +231.85499572753906 +175.77490234375 +238.19000244140625 +232.8000030517578 +176.2550048828125 +237.94000244140625 +232.8800048828125 +176.25999450683594 +237.8800048828125 +232.63999938964844 +176.6199951171875 +237.8018035888672 +231.92999267578125 +176.55499267578125 +237.4499969482422 +231.68499755859375 +176.34500122070312 +237.85000610351562 +231.2100067138672 +176.27999877929688 +241.14999389648438 +233.39999389648438 +177.7050018310547 +242.27999877929688 +233.23019409179688 +176.3000030517578 +244.52000427246094 +233.61000061035156 +176.0677032470703 +245.24380493164062 +232.72000122070312 +175.88499450683594 +245.48849487304688 +232.44000244140625 +175.59500122070312 +245.61000061035156 +231.83999633789062 +176.31500244140625 +245.2899932861328 +231.60000610351562 +176.5019073486328 +252.67160034179688 +230.27999877929688 +175.4199981689453 +255.789794921875 +229.22500610351562 +175.46009826660156 +253.72000122070312 +228.52999877929688 +182.1999969482422 +254.5928955078125 +228.60499572753906 +182.9949951171875 +255.24000549316406 +228.1300048828125 +182.68499755859375 +255.7899932861328 +227.93499755859375 +183.26010131835938 +256.0899963378906 +227.6199951171875 +183.61000061035156 +256.6173095703125 +222.35000610351562 +180.6522979736328 +256.1000061035156 +223.2899932861328 +180.21499633789062 +255.72689819335938 +222.64999389648438 +179.485595703125 +254.6699981689453 +221.85000610351562 +178.69000244140625 +254.63999938964844 +221.02000427246094 +177.89500427246094 +254.16990661621094 +220.17649841308594 +178.10000610351562 +254.52999877929688 +220.74000549316406 +178.4499969482422 +252.6219940185547 +221.13999938964844 +178.4949951171875 +252.1199951171875 +221.139892578125 +178.3542022705078 +252.1649932861328 +220.88999938964844 +176.2449951171875 +251.49000549316406 +220.9199981689453 +177.12010192871094 +251.76499938964844 +220.0850067138672 +176.72000122070312 +251.38999938964844 +219.77999877929688 +177.05999755859375 +252.24000549316406 +220.2100067138672 +176.8800048828125 +254.0 +219.75990295410156 +177.14500427246094 +253.50010681152344 +219.8300018310547 +178.0301055908203 +252.53030395507812 +219.80999755859375 +179.26510620117188 +253.5 +218.8699951171875 +177.9799041748047 +254.55999755859375 +217.02999877929688 +177.20989990234375 +256.9599914550781 +217.47000122070312 +177.0749969482422 +256.94000244140625 +218.1300048828125 +177.67999267578125 +255.02000427246094 +218.9149932861328 +175.58999633789062 +255.9700927734375 +219.44000244140625 +176.7449951171875 +255.6649932861328 +219.97500610351562 +176.52999877929688 +256.5199890136719 +220.39999389648438 +177.15499877929688 +256.55499267578125 +220.19000244140625 +177.7342987060547 +255.64500427246094 +220.27000427246094 +177.68499755859375 +255.4600067138672 +219.8000030517578 +178.19000244140625 +254.2198944091797 +221.4300994873047 +183.375 +253.47000122070312 +220.67630004882812 +182.3249969482422 +253.66000366210938 +221.36129760742188 +182.02999877929688 +253.39999389648438 +221.77000427246094 +181.9031982421875 +254.57000732421875 +221.51499938964844 +181.7100067138672 +253.99000549316406 +221.74000549316406 +180.89500427246094 +254.35000610351562 +222.1699981689453 +181.82000732421875 +254.88619995117188 +218.91000366210938 +184.73989868164062 +254.22000122070312 +218.7449951171875 +186.30990600585938 +254.53509521484375 +219.3300018310547 +186.73500061035156 +253.73500061035156 +219.25999450683594 +185.625 +253.33999633789062 +219.24949645996094 +186.2725067138672 +253.9499969482422 +219.5968017578125 +185.88999938964844 +254.55999755859375 +219.55999755859375 +186.55999755859375 +256.1614074707031 +219.42999267578125 +186.65499877929688 +255.52450561523438 +219.2386932373047 +186.55999755859375 +256.1600036621094 +221.14999389648438 +186.60499572753906 +256.1404113769531 +221.5399932861328 +187.57000732421875 +256.4849853515625 +221.9600067138672 +187.48440551757812 +255.94000244140625 +220.875 +187.18350219726562 +255.41000366210938 +220.60000610351562 +187.1699981689453 +256.2200927734375 +220.69009399414062 +190.1049041748047 +257.1650085449219 +220.52999877929688 +189.85499572753906 +257.3450012207031 +222.2899932861328 +189.2100067138672 +257.4100036621094 +222.47000122070312 +189.11929321289062 +257.8800048828125 +221.97000122070312 +188.87510681152344 +257.510009765625 +221.9149932861328 +189.18499755859375 +257.1400146484375 +222.41000366210938 +188.9199981689453 +257.8500061035156 +223.49000549316406 +188.94369506835938 +258.510009765625 +222.5863037109375 +189.47390747070312 +258.5487060546875 +222.1800994873047 +188.7001953125 +258.30999755859375 +220.38999938964844 +187.17750549316406 +258.3699951171875 +220.21310424804688 +187.47500610351562 +257.9200134277344 +219.64999389648438 +187.3249969482422 +258.0150146484375 +219.49000549316406 +187.62100219726562 +257.7799987792969 +218.3300018310547 +185.5 +257.5513000488281 +219.10879516601562 +185.9698944091797 +257.1300048828125 +219.60499572753906 +186.92999267578125 +256.55999755859375 +220.24000549316406 +186.14990234375 +256.18499755859375 +221.1699981689453 +185.58999633789062 +256.510009765625 +220.67999267578125 +185.80999755859375 +256.6499938964844 +220.8800048828125 +185.52999877929688 +256.67999267578125 +221.4669952392578 +188.01510620117188 +256.3789978027344 +221.25 +185.24000549316406 +256.3384094238281 +221.07000732421875 +185.47000122070312 +255.88999938964844 +221.17999267578125 +185.90980529785156 +256.06988525390625 +221.13499450683594 +185.89500427246094 +256.0199890136719 +221.1999969482422 +185.5863037109375 +256.489990234375 +221.8000030517578 +184.9600067138672 +257.8399963378906 +223.18499755859375 +189.0449981689453 +258.0400085449219 +223.97999572753906 +188.27000427246094 +258.20001220703125 +225.02999877929688 +188.18499755859375 +257.92498779296875 +225.87669372558594 +188.14999389648438 +257.9150085449219 +226.61000061035156 +188.42239379882812 +258.25 +225.39999389648438 +188.58999633789062 +258.0299987792969 +225.1999969482422 +189.07000732421875 +254.97999572753906 +222.6999969482422 +194.05499267578125 +254.89500427246094 +223.10000610351562 +193.73500061035156 +253.84500122070312 +224.16299438476562 +193.85000610351562 +253.4575958251953 +223.86000061035156 +192.61000061035156 +253.55999755859375 +226.27000427246094 +192.875 +253.89999389648438 +227.0449981689453 +193.1199951171875 +253.97999572753906 +227.6199951171875 +192.2949981689453 +255.17999267578125 +226.54879760742188 +195.2550048828125 +249.41000366210938 +220.52000427246094 +188.5998992919922 +248.61000061035156 +220.16000366210938 +189.14999389648438 +247.80999755859375 +219.02000427246094 +188.16000366210938 +247.16000366210938 +218.61000061035156 +187.72000122070312 +246.1649932861328 +217.80299377441406 +186.39999389648438 +245.27999877929688 +216.17999267578125 +183.13999938964844 +246.37600708007812 +220.11000061035156 +188.49000549316406 +248.59030151367188 +220.16000366210938 +188.27499389648438 +249.17999267578125 +220.1699981689453 +188.43179321289062 +249.1042022705078 +220.0500030517578 +188.5500030517578 +249.1461944580078 +220.52499389648438 +187.9250030517578 +248.32000732421875 +220.1199951171875 +187.80259704589844 +247.58999633789062 +220.0 +188.32000732421875 +247.02000427246094 +216.4250030517578 +182.38499450683594 +246.21400451660156 +216.4949951171875 +181.5500030517578 +247.38999938964844 +218.3000030517578 +183.43629455566406 +247.79800415039062 +218.9199981689453 +183.22500610351562 +247.48500061035156 +217.55999755859375 +182.17999267578125 +248.4199981689453 +217.48500061035156 +181.89990234375 +247.85000610351562 +216.44000244140625 +180.07000732421875 +250.85000610351562 +216.1999969482422 +182.36990356445312 +249.85989379882812 +215.44000244140625 +181.71090698242188 +249.77499389648438 +215.42010498046875 +180.69020080566406 +248.0904998779297 +213.61500549316406 +178.17999267578125 +249.64700317382812 +214.8000030517578 +179.79490661621094 +249.9199981689453 +215.18099975585938 +180.16000366210938 +249.42999267578125 +215.6300048828125 +179.8699951171875 +247.50999450683594 +217.5749969482422 +182.41000366210938 +248.23500061035156 +216.75999450683594 +182.32139587402344 +247.72000122070312 +215.5 +180.96499633789062 +247.22000122070312 +215.52999877929688 +182.3300018310547 +245.66000366210938 +213.17999267578125 +180.33999633789062 +246.5500030517578 +214.07000732421875 +180.78500366210938 +247.42999267578125 +214.47000122070312 +181.81100463867188 +249.5601043701172 +213.9600067138672 +183.27999877929688 +248.47999572753906 +211.58999633789062 +180.8719940185547 +250.29649353027344 +213.05999755859375 +182.6300048828125 +250.81500244140625 +212.36639404296875 +182.36000061035156 +252.3000030517578 +213.68499755859375 +183.69000244140625 +252.75999450683594 +213.25999450683594 +183.7100067138672 +252.3000030517578 +213.0500030517578 +183.24000549316406 +259.5050048828125 +215.3300018310547 +184.94400024414062 +262.57000732421875 +214.64999389648438 +183.78500366210938 +263.489990234375 +214.8800048828125 +183.80999755859375 +263.1650085449219 +215.7100067138672 +183.8159942626953 +263.7300109863281 +215.72000122070312 +183.63409423828125 +263.4200134277344 +216.35499572753906 +182.95530700683594 +262.2300109863281 +216.47000122070312 +182.57000732421875 +263.4999084472656 +221.72000122070312 +180.18499755859375 +263.6619873046875 +221.97000122070312 +181.91000366210938 +263.1700134277344 +222.97500610351562 +182.49000549316406 +263.3265075683594 +221.5449981689453 +181.47999572753906 +263.44989013671875 +222.5843048095703 +181.22999572753906 +263.0849914550781 +222.4600067138672 +181.3350067138672 +262.8399963378906 +222.02999877929688 +181.13999938964844 +260.0498962402344 +217.4499969482422 +180.3968963623047 +258.4299011230469 +218.73989868164062 +178.87010192871094 +258.54998779296875 +218.97000122070312 +179.22000122070312 +256.69140625 +217.8000030517578 +177.69000244140625 +256.5509948730469 +217.30499267578125 +177.7050018310547 +257.510009765625 +218.27000427246094 +179.47669982910156 +258.42999267578125 +217.97000122070312 +180.2899932861328 +259.4798889160156 +219.88560485839844 +181.58009338378906 +259.3999938964844 +220.27139282226562 +181.9949951171875 +260.0400085449219 +220.07000732421875 +181.82000732421875 +259.8599853515625 +219.77499389648438 +181.78500366210938 +259.9700012207031 +220.60000610351562 +182.7100067138672 +259.8999938964844 +220.96499633789062 +182.78500366210938 +259.5799865722656 +221.08999633789062 +182.1999969482422 +260.94140625 +223.47999572753906 +184.61500549316406 +263.2799987792969 +223.7899932861328 +185.19000244140625 +263.5799865722656 +224.76519775390625 +185.08999633789062 +263.6099853515625 +224.83999633789062 +185.0 +264.0199890136719 +224.85000610351562 +185.27499389648438 +263.5 +224.3350067138672 +186.91000366210938 +262.739990234375 +224.25999450683594 +186.25999450683594 +265.7300109863281 +227.35279846191406 +189.8800048828125 +265.7099914550781 +226.93350219726562 +190.92449951171875 +265.92999267578125 +227.30999755859375 +190.9250030517578 +265.6199951171875 +227.3800048828125 +191.3341064453125 +265.5950012207031 +227.82000732421875 +190.55999755859375 +267.2749938964844 +226.72999572753906 +190.7252960205078 +268.739990234375 +226.97999572753906 +191.42999267578125 +268.6499938964844 +226.52000427246094 +192.8249969482422 +268.69720458984375 +227.5500030517578 +192.80499267578125 +268.9949951171875 +229.11000061035156 +193.70010375976562 +269.4949951171875 +230.69000244140625 +194.58929443359375 +269.0902099609375 +230.05239868164062 +199.31199645996094 +269.20001220703125 +230.368896484375 +202.01499938964844 +269.0299987792969 +229.24000549316406 +201.02999877929688 +270.4200134277344 +229.1300048828125 +210.61000061035156 +267.6300048828125 +230.53500366210938 +208.7949981689453 +268.6199951171875 +231.3679962158203 +206.58999633789062 +269.93011474609375 +230.3721923828125 +206.78900146484375 +270.80999755859375 +229.69000244140625 +206.94000244140625 +268.30999755859375 +228.86000061035156 +207.0399932861328 +269.7300109863281 +230.33999633789062 +207.0500030517578 +269.0899963378906 +226.67999267578125 +202.20590209960938 +270.7900085449219 +227.9600067138672 +203.0749969482422 +272.010009765625 +226.1199951171875 +203.42990112304688 +271.95001220703125 +225.4199981689453 +203.05499267578125 +271.75 +225.08999633789062 +203.5904998779297 +271.3399963378906 +224.39100646972656 +202.54989624023438 +271.2900085449219 +222.77000427246094 +202.8000030517578 +270.3800048828125 +246.5500030517578 +205.47999572753906 +271.29998779296875 +247.7899932861328 +205.2801055908203 +272.43499755859375 +245.8000030517578 +203.98500061035156 +270.3487854003906 +246.02499389648438 +202.8365020751953 +271.80999755859375 +247.60000610351562 +204.27000427246094 +272.1050109863281 +246.85220336914062 +204.41000366210938 +270.25 +244.22000122070312 +202.41000366210938 +267.6300048828125 +255.33999633789062 +207.7949981689453 +266.6400146484375 +255.4600067138672 +207.9149932861328 +267.5350036621094 +256.01031494140625 +209.4199981689453 +267.6780090332031 +256.510009765625 +210.95989990234375 +267.30999755859375 +255.06500244140625 +207.7050018310547 +267.6199951171875 +254.8699951171875 +207.0749969482422 +269.05999755859375 +254.05999755859375 +207.0 +268.42999267578125 +253.38999938964844 +201.6595001220703 +270.6099853515625 +252.44009399414062 +201.85000610351562 +270.010009765625 +250.9550018310547 +200.97500610351562 +270.6383972167969 +249.8699951171875 +199.82510375976562 +270.5104064941406 +249.75 +200.19000244140625 +270.09051513671875 +249.42999267578125 +199.88499450683594 +270.2099914550781 +249.42999267578125 +198.5399932861328 +269.0101013183594 +248.60000610351562 +200.6300048828125 +270.2900085449219 +249.10000610351562 +202.33999633789062 +269.9700012207031 +249.80999755859375 +201.27000427246094 +270.1199951171875 +249.97000122070312 +200.9499969482422 +270.42999267578125 +249.12060546875 +201.03500366210938 +269.6000061035156 +248.44000244140625 +199.5301055908203 +270.1099853515625 +250.24000549316406 +195.1699981689453 +272.82000732421875 +247.1595001220703 +193.06500244140625 +272.1814880371094 +243.66000366210938 +190.6999969482422 +271.42498779296875 +243.94000244140625 +186.82000732421875 +271.3500061035156 +244.11000061035156 +189.20640563964844 +271.9901123046875 +245.40989685058594 +190.5 +271.2099914550781 +244.1199951171875 +189.82000732421875 +269.6600036621094 +243.0800018310547 +188.1699981689453 +271.5799865722656 +240.9499969482422 +182.42799377441406 +269.5299987792969 +240.00999450683594 +180.11219787597656 +269.1099853515625 +239.75999450683594 +182.05999755859375 +268.45001220703125 +240.5500030517578 +184.44000244140625 +267.25 +241.48989868164062 +184.98500061035156 +267.7598876953125 +243.3699951171875 +186.13499450683594 +268.4200134277344 +244.41000366210938 +188.2299041748047 +271.85699462890625 +248.02999877929688 +196.6199951171875 +269.06640625 +246.3800048828125 +194.12179565429688 +269.0799865722656 +247.10499572753906 +195.8656005859375 +269.7300109863281 +248.6300048828125 +196.71180725097656 +269.6600036621094 +248.7698974609375 +197.9199981689453 +269.11859130859375 +248.27000427246094 +198.74000549316406 +269.3599853515625 +248.41000366210938 +199.0399932861328 +274.1000061035156 +248.46780395507812 +192.52999877929688 +272.5 +247.5800018310547 +192.375 +273.31500244140625 +248.26829528808594 +192.4199981689453 +274.4800109863281 +249.3260040283203 +193.64999389648438 +275.32000732421875 +249.3699951171875 +193.97509765625 +275.25 +248.8800048828125 +194.10499572753906 +275.29998779296875 +249.13999938964844 +193.22999572753906 +272.94000244140625 +245.9250030517578 +192.69000244140625 +274.6000061035156 +245.3000030517578 +193.10000610351562 +274.3900146484375 +245.1699981689453 +192.0500030517578 +274.9800109863281 +245.44869995117188 +192.6300048828125 +274.45001220703125 +245.08749389648438 +192.12989807128906 +274.04998779296875 +245.16000366210938 +192.41000366210938 +273.4700012207031 +244.25 +193.85000610351562 +273.7099914550781 +242.53900146484375 +188.09609985351562 +274.037109375 +239.789794921875 +186.2899932861328 +272.8599853515625 +239.84500122070312 +186.92990112304688 +272.5700988769531 +238.07339477539062 +184.86500549316406 +273.5299987792969 +239.0500030517578 +186.00999450683594 +273.03961181640625 +238.3990020751953 +185.9499969482422 +273.0400085449219 +237.5800018310547 +186.9600067138672 +273.7591857910156 +236.7100067138672 +186.9644012451172 +274.6499938964844 +238.2899932861328 +189.97979736328125 +275.7049865722656 +237.55999755859375 +190.03500366210938 +274.5849914550781 +236.20640563964844 +189.1999969482422 +273.9599914550781 +236.25509643554688 +189.9600067138672 +272.989990234375 +235.1999969482422 +190.10000610351562 +272.4100036621094 +234.6999969482422 +190.27999877929688 +269.2799987792969 +230.72500610351562 +187.5500030517578 +267.8799133300781 +232.4199981689453 +187.1999969482422 +268.9200134277344 +233.52000427246094 +187.5800018310547 +267.7799987792969 +232.0 +186.72999572753906 +267.2900085449219 +231.39930725097656 +185.3300018310547 +266.44000244140625 +231.66000366210938 +184.93499755859375 +267.4599914550781 +232.88999938964844 +186.58999633789062 +267.6499938964844 +225.52000427246094 +181.85000610351562 +267.8399963378906 +226.25999450683594 +182.88999938964844 +267.1650085449219 +222.8144073486328 +181.5800018310547 +268.45001220703125 +223.64999389648438 +183.6199951171875 +268.03448486328125 +225.1999969482422 +183.4499969482422 +268.28021240234375 +224.1699981689453 +182.91000366210938 +267.510009765625 +222.55499267578125 +181.3000030517578 +271.8500061035156 +220.58999633789062 +187.6300048828125 +269.7300109863281 +222.05979919433594 +185.38999938964844 +270.3999938964844 +221.77999877929688 +184.38999938964844 +270.0299987792969 +220.58999633789062 +184.25999450683594 +269.6700134277344 +220.6999969482422 +184.6300048828125 +270.0350036621094 +222.67999267578125 +186.7050018310547 +268.57000732421875 +222.69000244140625 +186.69180297851562 +273.9049987792969 +226.41000366210938 +193.9199981689453 +271.7799987792969 +223.74000549316406 +189.75999450683594 +268.94000244140625 +219.4600067138672 +183.68519592285156 +268.80999755859375 +219.83389282226562 +184.50999450683594 +267.7950134277344 +219.57000732421875 +182.72000122070312 +267.32000732421875 +219.07000732421875 +182.3800048828125 +266.3800048828125 +217.14999389648438 +180.94000244140625 +269.8500061035156 +216.26499938964844 +175.7899932861328 +270.8999938964844 +218.5749969482422 +178.86000061035156 +270.54998779296875 +219.63999938964844 +181.07000732421875 +270.9800109863281 +218.7220001220703 +179.33470153808594 +272.6099853515625 +222.0500030517578 +184.19000244140625 +271.3699951171875 +220.18499755859375 +180.38999938964844 +271.489990234375 +220.64500427246094 +178.94000244140625 +273.0950012207031 +225.8699951171875 +178.0 +275.0 +224.94900512695312 +182.08999633789062 +274.8500061035156 +224.6199951171875 +182.47000122070312 +276.1199951171875 +224.97000122070312 +182.10000610351562 +276.2195129394531 +225.91000366210938 +181.8699951171875 +276.4750061035156 +226.09930419921875 +181.6699981689453 +275.9800109863281 +226.10000610351562 +182.5500030517578 +278.9049987792969 +226.7100067138672 +171.0749969482422 +277.8299865722656 +227.77000427246094 +174.7238006591797 +279.0700988769531 +229.25 +175.53500366210938 +278.760009765625 +229.55999755859375 +176.2050018310547 +278.0350036621094 +229.8000030517578 +174.77499389648438 +277.56500244140625 +229.49000549316406 +176.84170532226562 +276.95001220703125 +229.60000610351562 +177.8000030517578 +277.80999755859375 +230.51499938964844 +179.5850067138672 +279.0101013183594 +231.0841064453125 +180.91000366210938 +279.0790100097656 +230.8800048828125 +180.77999877929688 +278.54998779296875 +230.7100067138672 +180.80999755859375 +278.260009765625 +229.56500244140625 +180.5500030517578 +278.0799865722656 +229.42999267578125 +180.50999450683594 +277.4700012207031 +229.1199951171875 +180.19000244140625 +276.260009765625 +231.47999572753906 +177.2899932861328 +276.25 +231.94000244140625 +177.08140563964844 +277.04998779296875 +232.10450744628906 +177.1342010498047 +278.14208984375 +232.8800048828125 +178.86000061035156 +277.9200134277344 +233.97000122070312 +178.9600067138672 +279.7705078125 +234.36500549316406 +179.8350067138672 +280.58819580078125 +234.96009826660156 +179.40499877929688 +280.8900146484375 +234.17999267578125 +179.08999633789062 +281.9100036621094 +234.4781951904297 +179.37989807128906 +283.32000732421875 +233.9499969482422 +179.99000549316406 +284.57000732421875 +234.72000122070312 +183.2550048828125 +285.5400085449219 +234.39010620117188 +180.55999755859375 +285.8699951171875 +236.19000244140625 +182.16000366210938 +285.2149963378906 +235.16000366210938 +181.71499633789062 +285.625 +234.9821014404297 +181.0 +286.239990234375 +235.5 +181.42999267578125 +286.2300109863281 +234.3699951171875 +181.36000061035156 +287.34051513671875 +231.39999389648438 +180.3300018310547 +286.4100036621094 +232.18069458007812 +180.5500030517578 +286.385009765625 +232.47000122070312 +180.375 +285.6792907714844 +231.9600067138672 +180.64999389648438 +285.2099914550781 +231.92489624023438 +180.7449951171875 +284.55499267578125 +232.61000061035156 +180.02000427246094 +284.1499938964844 +232.3699951171875 +179.63999938964844 +281.2250061035156 +228.77499389648438 +181.08009338378906 +280.2799987792969 +227.89999389648438 +182.63510131835938 +280.114990234375 +227.1699981689453 +183.5449981689453 +280.0050048828125 +228.3000030517578 +183.61500549316406 +278.8599853515625 +228.30999755859375 +182.31500244140625 +280.125 +228.7082061767578 +182.32350158691406 +280.6499938964844 +229.10000610351562 +183.39999389648438 +280.4551086425781 +230.9384002685547 +182.7698974609375 +279.2950134277344 +229.6739959716797 +182.05999755859375 +278.31500244140625 +229.38999938964844 +181.77980041503906 +279.44000244140625 +229.83999633789062 +182.24000549316406 +279.2337951660156 +229.6750030517578 +181.45509338378906 +278.8013916015625 +229.25999450683594 +181.8574981689453 +278.7900085449219 +229.5500030517578 +182.35000610351562 +277.55999755859375 +229.0399932861328 +183.05059814453125 +277.4599914550781 +228.07000732421875 +183.48500061035156 +277.2300109863281 +227.2799072265625 +183.40499877929688 +276.9700012207031 +227.0500030517578 +185.89410400390625 +276.3599853515625 +227.08999633789062 +184.7064971923828 +276.92498779296875 +226.9741973876953 +184.88499450683594 +277.9599914550781 +226.99000549316406 +185.5800018310547 +277.70001220703125 +227.66000366210938 +184.6300048828125 +277.4100036621094 +227.83999633789062 +185.07000732421875 +277.875 +227.99000549316406 +184.88800048828125 +278.385009765625 +228.30999755859375 +184.8582000732422 +278.69000244140625 +227.97999572753906 +184.5449981689453 +277.864990234375 +227.9149932861328 +184.3300018310547 +277.2300109863281 +227.89999389648438 +184.97000122070312 +277.45001220703125 +231.73500061035156 +183.85960388183594 +278.2576904296875 +231.66000366210938 +182.8455047607422 +278.5264892578125 +230.72000122070312 +182.57000732421875 +278.1199951171875 +230.3350067138672 +182.61000061035156 +278.2200012207031 +230.26499938964844 +183.09579467773438 +278.9800109863281 +231.9199981689453 +183.7899932861328 +278.7200012207031 +231.69000244140625 +183.77999877929688 +276.1199951171875 +230.8800048828125 +178.0850067138672 +275.82501220703125 +228.85000610351562 +177.05990600585938 +277.9049987792969 +230.08250427246094 +178.4862060546875 +277.5226135253906 +229.47999572753906 +179.30499267578125 +277.760009765625 +229.8441925048828 +180.906494140625 +278.0950012207031 +229.6925048828125 +180.36990356445312 +278.05999755859375 +230.27000427246094 +180.9355010986328 +277.8699951171875 +226.3800048828125 +179.5399932861328 +277.739990234375 +226.02000427246094 +176.63499450683594 +277.8550109863281 +226.3300018310547 +176.52000427246094 +279.04998779296875 +226.99000549316406 +177.4499969482422 +277.95001220703125 +226.85000610351562 +176.2136993408203 +278.05499267578125 +226.71200561523438 +175.90499877929688 +278.3699951171875 +226.19000244140625 +174.99000549316406 +274.1449890136719 +223.02999877929688 +175.45159912109375 +275.510009765625 +224.38999938964844 +178.2519989013672 +274.9200134277344 +222.5449981689453 +177.59500122070312 +274.0400085449219 +222.375 +177.125 +273.3699951171875 +223.22259521484375 +177.13999938964844 +273.80499267578125 +222.6649932861328 +176.3300018310547 +274.114990234375 +222.5500030517578 +176.22999572753906 +273.1700134277344 +222.36500549316406 +176.1501007080078 +272.80999755859375 +222.75 +176.02000427246094 +273.20001220703125 +222.30999755859375 +176.48500061035156 +272.1300048828125 +221.47579956054688 +176.22000122070312 +273.56500244140625 +222.08999633789062 +176.74000549316406 +274.55999755859375 +222.64920043945312 +177.17880249023438 +274.4700012207031 +222.52999877929688 +177.50999450683594 +275.4949951171875 +224.77870178222656 +174.3800048828125 +273.489990234375 +224.13999938964844 +171.13499450683594 +272.8699951171875 +223.64500427246094 +171.4499053955078 +273.0199890136719 +223.7899932861328 +172.25 +273.7850036621094 +222.9149932861328 +170.9499053955078 +273.65008544921875 +222.02000427246094 +171.19000244140625 +271.8599853515625 +221.24099731445312 +170.9199981689453 +270.8999938964844 +227.58270263671875 +175.0399932861328 +272.29998779296875 +228.32000732421875 +174.88009643554688 +270.25 +225.80349731445312 +174.0399932861328 +272.6499938964844 +227.0449981689453 +174.91439819335938 +271.3699951171875 +226.58999633789062 +174.5500030517578 +271.8399963378906 +226.76499938964844 +174.6750030517578 +272.1600036621094 +226.75999450683594 +174.00999450683594 +271.7349853515625 +226.86000061035156 +178.66000366210938 +271.26080322265625 +227.85679626464844 +179.3000030517578 +270.6549987792969 +228.41000366210938 +180.5200958251953 +270.75 +228.66900634765625 +179.96499633789062 +271.3699951171875 +228.75990295410156 +180.57420349121094 +270.79998779296875 +228.64999389648438 +180.44850158691406 +273.6700134277344 +227.3699951171875 +180.99000549316406 +272.0150146484375 +227.82000732421875 +183.39999389648438 +272.44000244140625 +227.52999877929688 +183.6300048828125 +271.94000244140625 +228.01499938964844 +183.10000610351562 +270.9399108886719 +228.0 +183.22560119628906 +270.864990234375 +228.39500427246094 +183.3800048828125 +270.7200012207031 +228.83999633789062 +183.28500366210938 +270.82000732421875 +228.44000244140625 +183.61000061035156 +270.8399963378906 +230.11849975585938 +185.27499389648438 +271.7814025878906 +230.4600067138672 +187.91009521484375 +271.5299987792969 +231.38999938964844 +188.2144012451172 +271.70001220703125 +231.53799438476562 +187.9949951171875 +271.80999755859375 +232.0 +188.61810302734375 +272.10699462890625 +232.2100067138672 +188.78640747070312 +272.239990234375 +232.1199951171875 +189.2100067138672 +274.03509521484375 +232.10000610351562 +187.22999572753906 +274.85101318359375 +232.5399932861328 +187.94500732421875 +275.3599853515625 +232.80999755859375 +188.22500610351562 +274.8247985839844 +232.14990234375 +191.5800018310547 +274.8800048828125 +232.53500366210938 +191.02499389648438 +274.6400146484375 +232.95840454101562 +190.77969360351562 +274.5199890136719 +232.46580505371094 +191.53289794921875 +274.7601013183594 +232.74000549316406 +192.24000549316406 +273.9800109863281 +232.7949981689453 +191.42999267578125 +273.25 +232.5 +190.5399932861328 +273.9543151855469 +232.25 +187.2550048828125 +273.2200012207031 +231.52239990234375 +187.24459838867188 +273.0400085449219 +231.1300048828125 +186.8800048828125 +273.6400146484375 +231.50999450683594 +187.45989990234375 +273.67999267578125 +231.32000732421875 +187.375 +273.9028015136719 +232.10000610351562 +187.96449279785156 +273.79901123046875 +232.0800018310547 +188.22999572753906 +272.5899963378906 +231.30499267578125 +187.17030334472656 +272.85980224609375 +231.86000061035156 +188.25999450683594 +272.5899963378906 +231.2949981689453 +187.90989685058594 +273.1000061035156 +231.19569396972656 +188.21600341796875 +273.3900146484375 +231.6999053955078 +188.15420532226562 +273.1650085449219 +231.74000549316406 +187.5800018310547 +272.989990234375 +232.48989868164062 +187.5500030517578 +272.489990234375 +231.85879516601562 +189.01499938964844 +272.489990234375 +231.2100067138672 +188.8459930419922 +272.6700134277344 +231.36000061035156 +188.91990661621094 +272.625 +231.63999938964844 +188.97000122070312 +272.9609069824219 +231.8800048828125 +188.0449981689453 +272.0799865722656 +230.77999877929688 +187.13499450683594 +271.8399963378906 +230.83999633789062 +186.49000549316406 +273.3900146484375 +227.52499389648438 +190.58900451660156 +270.3245849609375 +225.88999938964844 +189.59939575195312 +270.1499938964844 +226.7064971923828 +189.47999572753906 +270.0799865722656 +225.6199951171875 +189.3616943359375 +270.1300048828125 +226.4499969482422 +189.20570373535156 +270.510009765625 +226.47999572753906 +188.9550018310547 +270.9800109863281 +226.5 +188.80990600585938 +269.80999755859375 +233.22000122070312 +190.0749969482422 +268.7900085449219 +232.25 +190.19000244140625 +266.9700012207031 +233.19000244140625 +187.6199951171875 +267.4200134277344 +232.61000061035156 +187.78500366210938 +266.2698974609375 +232.8450927734375 +186.64320373535156 +267.0190124511719 +232.64999389648438 +187.47000122070312 +267.260009765625 +233.0500030517578 +188.11000061035156 +264.0299987792969 +237.3300018310547 +191.39999389648438 +262.4198913574219 +238.6699981689453 +188.58999633789062 +262.8846130371094 +242.2301025390625 +189.03990173339844 +262.5400085449219 +241.69000244140625 +188.2899932861328 +262.87701416015625 +241.1750030517578 +187.9600067138672 +262.82000732421875 +240.86000061035156 +186.94000244140625 +262.42498779296875 +241.05499267578125 +187.25 +262.0299987792969 +242.42999267578125 +191.01499938964844 +261.0837097167969 +243.49000549316406 +189.5800018310547 +262.3599853515625 +244.41799926757812 +190.0030059814453 +261.2200012207031 +244.89999389648438 +189.625 +261.5899963378906 +243.25 +189.2801055908203 +261.3299865722656 +242.55999755859375 +188.99000549316406 +260.3599853515625 +241.5749969482422 +189.25 +256.7449951171875 +244.84010314941406 +186.10000610351562 +256.1099853515625 +244.47999572753906 +184.8800048828125 +256.7090148925781 +245.3679962158203 +184.25579833984375 +257.4800109863281 +245.67250061035156 +184.75 +256.6000061035156 +245.8000030517578 +184.14999389648438 +258.2799987792969 +245.80999755859375 +185.18649291992188 +259.05999755859375 +246.25900268554688 +185.1300048828125 +258.4599914550781 +245.66000366210938 +184.96200561523438 +256.9599914550781 +246.33250427246094 +185.30999755859375 +258.92999267578125 +245.9250030517578 +184.9541015625 +259.1199951171875 +245.75 +185.18499755859375 +259.7300109863281 +246.63009643554688 +185.88009643554688 +259.9649963378906 +247.0 +185.55499267578125 +259.3500061035156 +247.35000610351562 +184.85000610351562 +260.3500061035156 +247.6699981689453 +184.6199951171875 +260.2300109863281 +247.64759826660156 +185.23989868164062 +260.60931396484375 +248.0998992919922 +186.28500366210938 +260.8900146484375 +248.08999633789062 +186.7801055908203 +260.6400146484375 +248.0050048828125 +186.99000549316406 +260.9700012207031 +247.0500030517578 +186.00999450683594 +260.2099914550781 +246.4199981689453 +184.89999389648438 +260.090087890625 +243.5491943359375 +183.91749572753906 +259.9100036621094 +244.15499877929688 +185.22999572753906 +260.8399963378906 +244.35499572753906 +186.39999389648438 +259.989990234375 +242.71499633789062 +185.0699005126953 +259.739990234375 +241.3000030517578 +184.78990173339844 +259.0199890136719 +242.1199951171875 +184.72000122070312 +261.04998779296875 +242.61000061035156 +185.82000732421875 +259.75 +238.8300018310547 +181.6750030517578 +258.739990234375 +238.5800018310547 +181.98500061035156 +257.3800048828125 +237.49000549316406 +182.10000610351562 +257.5299987792969 +237.07000732421875 +182.22000122070312 +257.79998779296875 +237.57000732421875 +181.82000732421875 +259.9700012207031 +237.41000366210938 +182.14999389648438 +259.95001220703125 +236.6750030517578 +183.1699981689453 +260.10009765625 +237.75 +187.60000610351562 +260.4949951171875 +238.97999572753906 +187.5200958251953 +259.3299865722656 +239.49000549316406 +188.61349487304688 +259.5299987792969 +238.71499633789062 +189.2301025390625 +258.32000732421875 +237.85499572753906 +188.39500427246094 +257.6700134277344 +237.48269653320312 +187.4250030517578 +258.3299865722656 +238.1699981689453 +187.13999938964844 +256.80999755859375 +237.9199981689453 +187.63839721679688 +256.4399108886719 +237.8175048828125 +187.99000549316406 +255.8300018310547 +237.67919921875 +188.02999877929688 +256.0299987792969 +238.80499267578125 +187.93499755859375 +256.0 +237.64999389648438 +187.69000244140625 +256.17999267578125 +238.22500610351562 +187.74000549316406 +255.47999572753906 +239.05999755859375 +186.22999572753906 +251.61570739746094 +234.80690002441406 +180.8000030517578 +251.30499267578125 +234.2899932861328 +180.3199005126953 +250.55999755859375 +233.4600067138672 +180.0198974609375 +249.19500732421875 +231.77499389648438 +179.52000427246094 +247.45249938964844 +229.97999572753906 +179.43499755859375 +245.4600067138672 +230.6197052001953 +178.4949951171875 +246.69000244140625 +231.11000061035156 +178.2100067138672 +247.57000732421875 +231.25999450683594 +180.80999755859375 +247.3000030517578 +231.30499267578125 +182.73550415039062 +245.8300018310547 +228.44000244140625 +179.43499755859375 +245.8800048828125 +227.57000732421875 +180.2449951171875 +247.1103057861328 +229.42999267578125 +182.97999572753906 +248.38279724121094 +230.5399932861328 +183.7899932861328 +247.6300048828125 +231.35000610351562 +183.33999633789062 +250.1300048828125 +232.75 +184.8699951171875 +249.6999053955078 +234.77999877929688 +185.73550415039062 +249.74000549316406 +235.02740478515625 +184.97500610351562 +250.67999267578125 +235.22000122070312 +184.72549438476562 +250.52000427246094 +235.02000427246094 +184.65499877929688 +248.3699951171875 +233.97000122070312 +184.11000061035156 +248.36000061035156 +234.2899932861328 +184.85000610351562 +247.01010131835938 +238.0 +187.65499877929688 +248.35000610351562 +239.15499877929688 +187.75999450683594 +248.73989868164062 +239.86500549316406 +187.74009704589844 +247.92999267578125 +239.40609741210938 +187.89500427246094 +247.47500610351562 +239.4499969482422 +187.8300018310547 +248.19000244140625 +239.27000427246094 +187.22999572753906 +247.97000122070312 +239.19000244140625 +187.6699981689453 +254.0399932861328 +238.96499633789062 +187.3459930419922 +255.0998992919922 +239.84249877929688 +186.80499267578125 +254.5 +239.6300048828125 +186.66000366210938 +254.64999389648438 +239.0800018310547 +186.42999267578125 +255.94000244140625 +239.44000244140625 +186.5749969482422 +255.72500610351562 +239.24000549316406 +186.44500732421875 +255.4199981689453 +238.4199981689453 +186.38999938964844 +259.8450012207031 +242.0399932861328 +188.91510009765625 +260.7200012207031 +241.77000427246094 +189.70579528808594 +261.30999755859375 +242.35000610351562 +189.68499755859375 +260.2550048828125 +243.0800018310547 +189.48500061035156 +259.875 +243.8249969482422 +189.125 +259.3800048828125 +244.02999877929688 +189.4250030517578 +258.2699890136719 +244.67999267578125 +188.5399932861328 +256.0899963378906 +244.89999389648438 +191.40499877929688 +255.49000549316406 +243.0800018310547 +191.77999877929688 +254.82000732421875 +242.4425048828125 +191.09579467773438 +255.2550048828125 +242.94000244140625 +191.72000122070312 +255.11000061035156 +242.27000427246094 +191.52000427246094 +256.4750061035156 +243.08990478515625 +191.6230010986328 +256.44000244140625 +243.02000427246094 +191.52999877929688 +256.8999938964844 +238.78500366210938 +188.92999267578125 +256.1700134277344 +238.0 +187.8350067138672 +257.2200012207031 +239.97999572753906 +189.5449981689453 +257.3800048828125 +239.57260131835938 +190.05499267578125 +258.1449890136719 +239.51980590820312 +190.36000061035156 +258.2950134277344 +239.97999572753906 +190.94500732421875 +258.17498779296875 +241.67999267578125 +192.42999267578125 +254.0 +242.30999755859375 +191.65499877929688 +256.6875 +240.66009521484375 +192.231201171875 +255.2100067138672 +240.72000122070312 +192.8300018310547 +256.05499267578125 +238.63999938964844 +191.27000427246094 +257.5849914550781 +240.1699981689453 +191.47000122070312 +259.9100036621094 +239.94000244140625 +189.84500122070312 +259.4800109863281 +239.25999450683594 +191.28500366210938 +265.0400085449219 +244.7550048828125 +188.58749389648438 +264.29180908203125 +244.5399932861328 +189.139892578125 +264.17999267578125 +244.96029663085938 +189.21009826660156 +265.1300048828125 +243.5850067138672 +189.73500061035156 +267.17999267578125 +243.52999877929688 +189.9199981689453 +268.9800109863281 +242.9582061767578 +186.1750030517578 +269.9599914550781 +242.9409942626953 +185.69000244140625 +269.885009765625 +239.21499633789062 +180.29989624023438 +268.8949890136719 +237.5800018310547 +179.10000610351562 +268.8999938964844 +237.3000030517578 +180.00010681152344 +269.3399963378906 +236.92990112304688 +179.1584930419922 +271.4800109863281 +236.1699981689453 +178.69500732421875 +269.2099914550781 +237.3800048828125 +178.69700622558594 +269.4599914550781 +238.63299560546875 +180.3300018310547 +276.1000061035156 +237.4949951171875 +177.19520568847656 +277.21380615234375 +236.9499969482422 +175.25 +275.25 +233.42019653320312 +173.35000610351562 +275.6000061035156 +233.7449951171875 +174.12660217285156 +274.9100036621094 +232.60000610351562 +174.94009399414062 +277.6099853515625 +233.8000030517578 +175.27099609375 +276.4599914550781 +232.92999267578125 +174.1999969482422 +276.7850036621094 +222.27000427246094 +171.5850067138672 +275.2200012207031 +223.69000244140625 +174.2550048828125 +274.739990234375 +224.7050018310547 +175.28500366210938 +274.32000732421875 +223.3905029296875 +174.3300018310547 +277.0450134277344 +223.1699981689453 +173.6699981689453 +276.6300048828125 +223.1699981689453 +172.26010131835938 +275.9200134277344 +222.5 +171.82000732421875 +279.2900085449219 +204.8699951171875 +182.64999389648438 +279.114990234375 +204.89999389648438 +183.97999572753906 +278.67999267578125 +208.05999755859375 +184.5312042236328 +277.7749938964844 +207.25999450683594 +184.5102996826172 +277.1300048828125 +207.39999389648438 +184.44500732421875 +277.6600036621094 +207.7899932861328 +185.3350067138672 +278.0799865722656 +210.31500244140625 +185.41000366210938 +273.08270263671875 +207.14999389648438 +190.66000366210938 +273.398193359375 +209.6300048828125 +191.8249969482422 +272.0115051269531 +210.31500244140625 +191.58999633789062 +271.9800109863281 +210.44000244140625 +190.9929962158203 +273.6199951171875 +209.19000244140625 +191.00999450683594 +274.0400085449219 +209.03500366210938 +189.89999389648438 +274.5400085449219 +208.66000366210938 +189.7899932861328 +274.4200134277344 +211.80499267578125 +189.17320251464844 +274.05999755859375 +210.08740234375 +189.12010192871094 +273.3500061035156 +209.9949951171875 +189.69000244140625 +274.05499267578125 +207.75999450683594 +189.2449951171875 +273.9649963378906 +208.2550048828125 +189.21499633789062 +274.07000732421875 +207.71800231933594 +189.10000610351562 +273.7900085449219 +206.99000549316406 +188.61000061035156 +277.05010986328125 +204.96189880371094 +188.9199981689453 +278.19000244140625 +204.3800048828125 +191.289794921875 +279.94500732421875 +203.4492950439453 +191.98500061035156 +278.9599914550781 +204.27890014648438 +191.43099975585938 +279.5799865722656 +205.11500549316406 +192.0449981689453 +276.04998779296875 +203.88499450683594 +191.05999755859375 +275.5400085449219 +204.00999450683594 +190.02999877929688 +271.25 +202.31500244140625 +191.69000244140625 +266.1700134277344 +197.77000427246094 +187.30499267578125 +264.6000061035156 +199.5 +189.5749969482422 +262.3299865722656 +199.3350067138672 +189.25 +261.7799987792969 +199.1199951171875 +189.0500030517578 +261.489990234375 +198.375 +187.60000610351562 +261.5899963378906 +199.4499969482422 +186.91000366210938 diff --git a/messaging/clients/curl/test_get.sh b/messaging/clients/curl/test_get.sh new file mode 100755 index 0000000..4c9d7b0 --- /dev/null +++ b/messaging/clients/curl/test_get.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +export REPEAT=100 + +echo "Getting $REPEAT messages" + +for i in $(seq $REPEAT) +do + echo "Msg $i ----" + . ./get_portfolio_order.sh + sleep 1 + echo "" +done diff --git a/messaging/clients/curl/test_post.sh b/messaging/clients/curl/test_post.sh new file mode 100755 index 0000000..05a51f3 --- /dev/null +++ b/messaging/clients/curl/test_post.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +export REPEAT=100 + +echo "Posting $REPEAT messages" + +for i in $(seq $REPEAT) +do + echo "Msg $i ----" + . ./post_portfolio_order.sh + SLEEP_TIME=$(expr $RANDOM % 3) + sleep $SLEEP_TIME + echo "" +done diff --git a/messaging/config/krakend.json b/messaging/config/krakend.json index c583167..0d30831 100644 --- a/messaging/config/krakend.json +++ b/messaging/config/krakend.json @@ -7,17 +7,15 @@ "name": "stocksconsumer", "extra_config": { "async/kafka": { - "group_id": "my_group_id", - "topics": [ - "stockprice" - ], - "connection": { + "cluster": { "brokers": [ "localhost:9092" ], "client_id": "cid_stocksconsumer" }, - "consumer": {} + "group": { + "id": "my_group_id" + } } }, "connection": { @@ -26,7 +24,7 @@ "health_interval": "30s" }, "consumer": { - "topic": "*", + "topic": "stockprice", "workers": 1, "timeout": "1s" }, @@ -40,11 +38,7 @@ "name": "portfolioupdatesconsumer", "extra_config": { "async/kafka": { - "group_id": "k_async_updates", - "topics": [ - "portfolioupdates" - ], - "connection": { + "cluster": { "brokers": [ "localhost:49092" ], @@ -62,7 +56,9 @@ ] } }, - "consumer": {} + "group": { + "id": "k_async_updates" + } } }, "connection": { @@ -71,7 +67,7 @@ "health_interval": "30s" }, "consumer": { - "topic": "*", + "topic": "portfolioupdates", "workers": 1, "timeout": "1s" }, @@ -99,7 +95,7 @@ "writer": { "topic": "orderplacement", "key_meta": "X-Idempotency-Key", - "connection": { + "cluster": { "brokers": [ "localhost:49092" ], @@ -137,8 +133,7 @@ "reader": { "topics": ["orderplacement"], "key_meta": "X-Idempotency-Key", - "group_id": "k_endpoint_read", - "connection": { + "cluster": { "brokers": [ "localhost:49092" ], @@ -156,7 +151,8 @@ ] } }, - "consumer": { + "group": { + "id": "k_endpoint_read", "isolation_level": "read_commited" } } @@ -164,6 +160,34 @@ } } ] + }, + { + "endpoint": "/ticker/publish", + "method": "POST", + "input_headers": [ "X-Ticker", "X-Time" ], + "backend": [ + { + "url_pattern": "/_publish/stock/prices", + "extra_config": { + "backend/pubsub/publisher/kafka": { + "success_status_code": 201, + "writer": { + "topic": "stockprice", + "key_meta": "X-Ticker", + "cluster": { + "brokers": [ + "localhost:9092" + ], + "client_id": "krakend_ticker_generator" + }, + "producer": { + "idempotent": true + } + } + } + } + } + ] } ], "extra_config": { diff --git a/messaging/config/telemetry-dashboards/prometheus/prometheus.yml b/messaging/config/telemetry-dashboards/prometheus/prometheus.yml index 0eb4318..1c8a0be 100644 --- a/messaging/config/telemetry-dashboards/prometheus/prometheus.yml +++ b/messaging/config/telemetry-dashboards/prometheus/prometheus.yml @@ -15,4 +15,4 @@ scrape_configs: - targets: - '192.168.1.22:9099' labels: - app: lokrakend + app: local_krakend From 7c297ce8babd87bb6f26413fb211e96241a166eb Mon Sep 17 00:00:00 2001 From: David Hontecillas Date: Thu, 19 Mar 2026 14:36:00 +0100 Subject: [PATCH 20/20] update messaging krakend config example --- messaging/config/krakend.json | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/messaging/config/krakend.json b/messaging/config/krakend.json index 0d30831..8231954 100644 --- a/messaging/config/krakend.json +++ b/messaging/config/krakend.json @@ -11,7 +11,9 @@ "brokers": [ "localhost:9092" ], - "client_id": "cid_stocksconsumer" + "client_id": "cid_stocksconsumer", + "metadata_retry_max": 999999, + "metadata_retry_backoff": "1s" }, "group": { "id": "my_group_id" @@ -19,7 +21,7 @@ } }, "connection": { - "max_retries": 2, + "max_retries": -1, "backoff_strategy": "linear", "health_interval": "30s" }, @@ -43,6 +45,8 @@ "localhost:49092" ], "client_id": "cid_portfolioupdateconsumer", + "metadata_retry_max": 999999, + "metadata_retry_backoff": "1s", "client_tls": { "allow_insecure_connections": false, "ca_certs": [ @@ -99,6 +103,8 @@ "brokers": [ "localhost:49092" ], + "metadata_retry_max": 999999, + "metadata_retry_backoff": "1s", "client_id": "krakend_async_agent", "client_tls": { "allow_insecure_connections": false, @@ -137,6 +143,8 @@ "brokers": [ "localhost:49092" ], + "metadata_retry_max": 999999, + "metadata_retry_backoff": "1s", "client_id": "krakend_async_agent", "client_tls": { "allow_insecure_connections": false, @@ -178,6 +186,8 @@ "brokers": [ "localhost:9092" ], + "metadata_retry_max": 999999, + "metadata_retry_backoff": "1s", "client_id": "krakend_ticker_generator" }, "producer": { @@ -192,7 +202,7 @@ ], "extra_config": { "telemetry/opentelemetry": { - "service_name": "krakend_prometheus_service", + "service_name": "krakend_promie", "metric_reporting_period": 1, "trace_sample_rate": 1, "exporters": {