Revert "Merge branch 'state_timeline'"

This reverts commit 83e4609af1, reversing
changes made to 089161b20f.
This commit is contained in:
Samuel Clay 2021-12-15 14:17:48 -05:00
parent 9af580e508
commit e70ba4a8c0
7 changed files with 584 additions and 461 deletions

View file

@ -51,8 +51,7 @@
file: /srv/newsblur/flask_metrics/flask_metrics_mongo.py file: /srv/newsblur/flask_metrics/flask_metrics_mongo.py
- service_name: redis - service_name: redis
file: /srv/newsblur/flask_metrics/flask_metrics_redis.py file: /srv/newsblur/flask_metrics/flask_metrics_redis.py
- service_name: metrics
file: /srv/newsblur/flask_metrics/state_timeline.py
- name: Restart flask_metrics - name: Restart flask_metrics
become: yes become: yes
shell: shell:

View file

@ -69,20 +69,6 @@ services:
- nginx - nginx
volumes: volumes:
- ${PWD}:/srv/newsblur - ${PWD}:/srv/newsblur
flask_metrics_state:
container_name: flask_metrics_state
image: newsblur/newsblur_monitor:latest
command: bash -c "python /srv/newsblur/flask_metrics/state_timeline.py"
environment:
- DOCKERBUILD=True
ports:
- 5599:5569
depends_on:
- haproxy
- newsblur_web
- nginx
volumes:
- ${PWD}:/srv/newsblur
elasticsearch_exporter: elasticsearch_exporter:
container_name: elasticsearch_exporter container_name: elasticsearch_exporter
image: prometheuscommunity/elasticsearch-exporter:latest image: prometheuscommunity/elasticsearch-exporter:latest

View file

@ -144,8 +144,8 @@
"overrides": [] "overrides": []
}, },
"gridPos": { "gridPos": {
"h": 27, "h": 8,
"w": 24, "w": 12,
"x": 0, "x": 0,
"y": 0 "y": 0
}, },
@ -166,26 +166,162 @@
"targets": [ "targets": [
{ {
"exemplar": true, "exemplar": true,
"expr": "state", "expr": "redis_state",
"interval": "", "interval": "",
"legendFormat": "{{ servername }}", "legendFormat": "{{ servername }}",
"refId": "A" "refId": "A"
} }
], ],
"title": "Service State", "title": "Redis State",
"type": "state-timeline" "type": "state-timeline"
}, },
{ {
"collapsed": true, "datasource": "Prometheus",
"description": "",
"fieldConfig": {
"defaults": {
"color": {
"mode": "palette-classic"
},
"custom": {
"fillOpacity": 70,
"lineWidth": 0
},
"mappings": [
{
"options": {
"0": {
"color": "super-light-red",
"index": 0,
"text": "UNK"
},
"1": {
"color": "semi-dark-yellow",
"index": 1,
"text": "INI"
},
"2": {
"color": "semi-dark-red",
"index": 2,
"text": "SOCKERR"
},
"3": {
"color": "dark-green",
"index": 3,
"text": "L4OK"
},
"4": {
"color": "dark-red",
"index": 4,
"text": "L4TOUT"
},
"5": {
"color": "dark-red",
"index": 5,
"text": "L4CON"
},
"6": {
"color": "dark-green",
"index": 6,
"text": "L6OK"
},
"7": {
"color": "dark-red",
"index": 7,
"text": "L6TOUT"
},
"8": {
"color": "dark-red",
"index": 8,
"text": "L6RSP"
},
"9": {
"color": "dark-green",
"index": 9,
"text": "L7OK"
},
"10": {
"color": "semi-dark-red",
"index": 10,
"text": "L7OKC"
},
"11": {
"color": "dark-red",
"index": 11,
"text": "L7TOUT"
},
"12": {
"color": "dark-red",
"index": 12,
"text": "L7RSP"
},
"13": {
"color": "dark-red",
"index": 13,
"text": "L7STS"
}
},
"type": "value"
}
],
"thresholds": {
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
}
]
}
},
"overrides": []
},
"gridPos": {
"h": 8,
"w": 12,
"x": 12,
"y": 0
},
"id": 83,
"options": {
"alignValue": "left",
"legend": {
"displayMode": "table",
"placement": "bottom"
},
"mergeValues": true,
"rowHeight": 0.9,
"showValue": "auto",
"tooltip": {
"mode": "single"
}
},
"targets": [
{
"exemplar": true,
"expr": "mongo_state",
"interval": "",
"legendFormat": "{{ servername }}",
"refId": "A"
}
],
"title": "Mongo State",
"type": "state-timeline"
},
{
"collapsed": false,
"datasource": null, "datasource": null,
"gridPos": { "gridPos": {
"h": 1, "h": 1,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 27 "y": 8
}, },
"id": 46, "id": 46,
"panels": [ "panels": [],
"title": "Top Line",
"type": "row"
},
{ {
"aliasColors": {}, "aliasColors": {},
"bars": false, "bars": false,
@ -204,7 +340,7 @@
"h": 6, "h": 6,
"w": 8, "w": 8,
"x": 0, "x": 0,
"y": 28 "y": 9
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 22, "id": 22,
@ -317,7 +453,7 @@
"h": 6, "h": 6,
"w": 8, "w": 8,
"x": 8, "x": 8,
"y": 28 "y": 9
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 44, "id": 44,
@ -443,7 +579,7 @@
"h": 6, "h": 6,
"w": 8, "w": 8,
"x": 16, "x": 16,
"y": 28 "y": 9
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 38, "id": 38,
@ -540,10 +676,6 @@
"align": false, "align": false,
"alignLevel": null "alignLevel": null
} }
}
],
"title": "Top Line",
"type": "row"
}, },
{ {
"collapsed": false, "collapsed": false,
@ -552,7 +684,7 @@
"h": 1, "h": 1,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 28 "y": 15
}, },
"id": 20, "id": 20,
"panels": [], "panels": [],
@ -579,7 +711,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 0, "x": 0,
"y": 29 "y": 16
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 2, "id": 2,
@ -685,7 +817,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 12, "x": 12,
"y": 29 "y": 16
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 6, "id": 6,
@ -781,7 +913,7 @@
"h": 1, "h": 1,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 37 "y": 24
}, },
"id": 4, "id": 4,
"panels": [], "panels": [],
@ -818,7 +950,7 @@
"h": 21, "h": 21,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 38 "y": 25
}, },
"id": 10, "id": 10,
"options": { "options": {
@ -872,7 +1004,7 @@
"h": 7, "h": 7,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 59 "y": 46
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 48, "id": 48,
@ -963,7 +1095,7 @@
"h": 1, "h": 1,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 66 "y": 53
}, },
"id": 42, "id": 42,
"panels": [], "panels": [],
@ -982,7 +1114,7 @@
"h": 9, "h": 9,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 67 "y": 54
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 33, "id": 33,
@ -1085,7 +1217,7 @@
"h": 8, "h": 8,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 76 "y": 63
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 30, "id": 30,
@ -1280,7 +1412,7 @@
"h": 8, "h": 8,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 84 "y": 71
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 32, "id": 32,
@ -1379,7 +1511,7 @@
"h": 7, "h": 7,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 92 "y": 79
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 28, "id": 28,
@ -1492,7 +1624,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 0, "x": 0,
"y": 99 "y": 86
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 12, "id": 12,
@ -1586,7 +1718,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 12, "x": 12,
"y": 99 "y": 86
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 26, "id": 26,
@ -1677,7 +1809,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 0, "x": 0,
"y": 107 "y": 94
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 14, "id": 14,
@ -1763,7 +1895,7 @@
"h": 1, "h": 1,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 115 "y": 102
}, },
"id": 50, "id": 50,
"panels": [], "panels": [],
@ -1782,7 +1914,7 @@
"h": 8, "h": 8,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 116 "y": 103
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 56, "id": 56,
@ -1877,7 +2009,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 0, "x": 0,
"y": 124 "y": 111
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 52, "id": 52,
@ -1970,7 +2102,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 12, "x": 12,
"y": 124 "y": 111
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 54, "id": 54,
@ -2063,7 +2195,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 0, "x": 0,
"y": 132 "y": 119
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 58, "id": 58,
@ -2156,7 +2288,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 12, "x": 12,
"y": 132 "y": 119
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 60, "id": 60,
@ -2244,7 +2376,7 @@
"h": 1, "h": 1,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 140 "y": 127
}, },
"id": 62, "id": 62,
"panels": [], "panels": [],
@ -2263,7 +2395,7 @@
"h": 8, "h": 8,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 141 "y": 128
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 75, "id": 75,
@ -2358,7 +2490,7 @@
"h": 8, "h": 8,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 149 "y": 136
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 66, "id": 66,
@ -2519,7 +2651,7 @@
"h": 8, "h": 8,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 157 "y": 144
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 71, "id": 71,
@ -2665,7 +2797,7 @@
"h": 8, "h": 8,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 165 "y": 152
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 72, "id": 72,
@ -2797,7 +2929,7 @@
"h": 7, "h": 7,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 173 "y": 160
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 73, "id": 73,
@ -2897,7 +3029,7 @@
"h": 8, "h": 8,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 180 "y": 167
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 78, "id": 78,
@ -2990,7 +3122,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 0, "x": 0,
"y": 188 "y": 175
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 80, "id": 80,
@ -3083,7 +3215,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 12, "x": 12,
"y": 188 "y": 175
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 64, "id": 64,
@ -3171,7 +3303,7 @@
"h": 1, "h": 1,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 196 "y": 183
}, },
"id": 68, "id": 68,
"panels": [], "panels": [],
@ -3190,7 +3322,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 0, "x": 0,
"y": 197 "y": 184
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 70, "id": 70,
@ -3283,7 +3415,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 12, "x": 12,
"y": 197 "y": 184
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 76, "id": 76,
@ -3371,7 +3503,7 @@
"h": 1, "h": 1,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 205 "y": 192
}, },
"id": 16, "id": 16,
"panels": [], "panels": [],
@ -3390,7 +3522,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 0, "x": 0,
"y": 206 "y": 193
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 18, "id": 18,
@ -3481,7 +3613,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 12, "x": 12,
"y": 206 "y": 193
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 24, "id": 24,
@ -3572,7 +3704,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 0, "x": 0,
"y": 214 "y": 201
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 35, "id": 35,
@ -3663,7 +3795,7 @@
"h": 8, "h": 8,
"w": 12, "w": 12,
"x": 12, "x": 12,
"y": 214 "y": 201
}, },
"hiddenSeries": false, "hiddenSeries": false,
"id": 8, "id": 8,
@ -3749,7 +3881,7 @@
"h": 1, "h": 1,
"w": 24, "w": 24,
"x": 0, "x": 0,
"y": 222 "y": 209
}, },
"id": 40, "id": 40,
"panels": [ "panels": [
@ -3829,12 +3961,12 @@
"list": [] "list": []
}, },
"time": { "time": {
"from": "now-5m", "from": "now-7d",
"to": "now" "to": "now"
}, },
"timepicker": {}, "timepicker": {},
"timezone": "", "timezone": "",
"title": "NewsBlur", "title": "NewsBlur",
"uid": "T86VjXrG2", "uid": "T86VjXrG2",
"version": 22 "version": 17
} }

View file

@ -238,7 +238,19 @@ scrape_configs:
- source_labels: ['__meta_consul_node'] - source_labels: ['__meta_consul_node']
target_label: instance target_label: instance
- job_name: 'haproxy state' - job_name: 'redis state'
static_configs: consul_sd_configs:
- targets: ['localhost:5569'] - server: 'consul.service.nyc1.consul:8500'
services: ['flask_metrics_redis']
relabel_configs:
- source_labels: ['__meta_consul_node']
target_label: instance
metrics_path: /state/
- job_name: 'mongo state'
consul_sd_configs:
- server: 'consul.service.nyc1.consul:8500'
services: ['flask_metrics_mongo']
relabel_configs:
- source_labels: ['__meta_consul_node']
target_label: instance
metrics_path: /state/ metrics_path: /state/

View file

@ -230,9 +230,16 @@ scrape_configs:
tls_config: tls_config:
insecure_skip_verify: true insecure_skip_verify: true
- job_name: 'service state' - job_name: 'redis state'
static_configs: static_configs:
- targets: ['flask_metrics_state:5569'] - targets: ['flask_metrics_redis:5569']
metrics_path: /state/
scheme: http
tls_config:
insecure_skip_verify: true
- job_name: 'mongo state'
static_configs:
- targets: ['flask_metrics_mongo:5569']
metrics_path: /state/ metrics_path: /state/
scheme: http scheme: http
tls_config: tls_config:

View file

@ -1,5 +1,6 @@
from flask import Flask, render_template, Response from flask import Flask, render_template, Response
import pymongo import pymongo
from flask_metrics.state_timeline import format_state_data, get_state
from newsblur_web import settings from newsblur_web import settings
import sentry_sdk import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration from sentry_sdk.integrations.flask import FlaskIntegration
@ -165,6 +166,20 @@ def page_queues():
html_body = render_template('prometheus_data.html', **context) html_body = render_template('prometheus_data.html', **context)
return Response(html_body, content_type="text/plain") return Response(html_body, content_type="text/plain")
@app.route("/state/")
def mongo_state():
mongo_data = get_state("mongo")
if 'BACKEND' in mongo_data:
del mongo_data['BACKEND']
formatted_data = format_state_data("mongo_state", mongo_data)
context = {
'chart_name': 'mongo_state',
'chart_type': 'gauge',
'data': formatted_data
}
html_body = render_template('prometheus_data.html', **context)
return Response(html_body, content_type="text/plain")
if __name__ == "__main__": if __name__ == "__main__":
print(" ---> Starting NewsBlur Flask Metrics server...") print(" ---> Starting NewsBlur Flask Metrics server...")

View file

@ -1,19 +1,7 @@
from flask import Flask, render_template, Response from flask import render_template
import requests import requests
from requests.auth import HTTPBasicAuth from requests.auth import HTTPBasicAuth
from newsblur_web import settings
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration
if settings.FLASK_SENTRY_DSN is not None:
sentry_sdk.init(
dsn=settings.FLASK_SENTRY_DSN,
integrations=[FlaskIntegration()],
traces_sample_rate=1.0,
)
app = Flask(__name__)
STATUS_MAPPING = { STATUS_MAPPING = {
"UNK": 0, # unknown "UNK": 0, # unknown
@ -39,32 +27,16 @@ def format_state_data(label, data):
formatted_data[k] = f'{label}{{servername="{k}"}} {STATUS_MAPPING[v.strip()]}' formatted_data[k] = f'{label}{{servername="{k}"}} {STATUS_MAPPING[v.strip()]}'
return formatted_data return formatted_data
def get_state(): def get_state(backend_name):
res = requests.get('https://newsblur.com:1936/;csv', auth=HTTPBasicAuth('gimmiestats', 'StatsGiver')) res = requests.get('https://newsblur.com:1936/;csv', auth=HTTPBasicAuth('gimmiestats', 'StatsGiver'))
lines = res.content.decode('utf-8').split('\n') lines = res.content.decode('utf-8').split('\n')
backends = [line.split(",") for line in lines][1:] backends = [line.split(",") for line in lines if backend_name in line]
check_status_index = lines[0].split(",").index('check_status') check_status_index = lines[0].split(",").index('check_status')
servername_index = lines[0].split(",").index('svname') servername_index = lines[0].split(",").index('svname')
data = {} data = {}
for backend_data in backends: for backend_data in backends:
if backend_data != [''] and backend_data[servername_index] != 'FRONTEND':
data[backend_data[servername_index]] = backend_data[check_status_index].replace("*", "") data[backend_data[servername_index]] = backend_data[check_status_index].replace("*", "")
return data return data
@app.route("/state/")
def state():
state_data = get_state()
formatted_data = format_state_data("state", state_data)
context = {
'chart_name': 'state',
'chart_type': 'gauge',
'data': formatted_data
}
html_body = render_template('prometheus_data.html', **context)
return Response(html_body, content_type="text/plain")
if __name__ == "__main__":
print(" ---> Starting State Timeline Flask Metrics server...")
app.run(host="0.0.0.0", port=5569)