diff --git a/collector.go b/collector.go index 2405ab8..a6de4f1 100644 --- a/collector.go +++ b/collector.go @@ -69,6 +69,18 @@ func collectPing() { } } +func collectMeta() { + for { + time.Sleep(1 * time.Minute) + meta, err := client.Meta().InstanceMeta(true) + if err != nil { + logrus.WithField("type", "meta").Warning(err) + continue + } + misskeyMeta.WithLabelValues(*meta.Version).Set(1) + } +} + func collectStats() { for { time.Sleep(30 * time.Second) diff --git a/dashboards.json b/dashboards.json index 35295b2..c3f6ad1 100644 --- a/dashboards.json +++ b/dashboards.json @@ -23,7 +23,6 @@ "panels": [ { "datasource": { - "type": "prometheus", "uid": "cej25be7w5af4e" }, "fieldConfig": { @@ -31,36 +30,23 @@ "color": { "mode": "thresholds" }, - "fieldMinMax": false, - "mappings": [ - { - "options": { - "0": { - "index": 1, - "text": "DOWN" - }, - "1": { - "index": 0, - "text": "UP" - } - }, - "type": "value" - } - ], - "noValue": "UNKNOWN", + "custom": { + "align": "auto", + "cellOptions": { + "type": "auto" + }, + "inspect": false + }, + "mappings": [], "thresholds": { "mode": "absolute", "steps": [ { - "color": "red" + "color": "green" }, { "color": "red", - "value": 0 - }, - { - "color": "green", - "value": 1 + "value": 80 } ] } @@ -68,140 +54,60 @@ "overrides": [] }, "gridPos": { - "h": 6, - "w": 3, + "h": 3, + "w": 6, "x": 0, "y": 0 }, - "id": 1, + "id": 12, "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "last" - ], + "cellHeight": "sm", + "footer": { + "countRows": false, "fields": "", - "values": false + "reducer": [ + "sum" + ], + "show": false }, - "showPercentChange": false, - "textMode": "auto", - "wideLayout": true + "showHeader": false }, "pluginVersion": "11.6.0", "targets": [ { - "datasource": { - "type": "prometheus", - "uid": "cej25be7w5af4e" - }, "disableTextWrap": false, "editorMode": "builder", - "expr": "misskey_health", + "exemplar": false, + "expr": "misskey_meta{instance=\"$instance\", job=\"$job\"}", + "format": "table", "fullMetaSearch": false, "includeNullMetadata": true, + "instant": true, "legendFormat": "__auto", - "range": true, + "range": false, "refId": "A", "useBackend": false } ], - "title": "Health", - "type": "stat" - }, - { - "datasource": { - "type": "prometheus", - "uid": "cej25be7w5af4e" - }, - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "fieldMinMax": false, - "mappings": [ - { - "options": { - "0": { - "index": 1, - "text": "DOWN" - }, - "1": { - "index": 0, - "text": "UP" - } - }, - "type": "value" - } - ], - "noValue": "UNKNOWN", - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "red" - }, - { - "color": "red", - "value": 0 - }, - { - "color": "green", - "value": 1 - } - ] + "title": "Misskey Version", + "transformations": [ + { + "id": "organize", + "options": { + "excludeByName": { + "Time": true, + "Value": true, + "__name__": true, + "instance": true, + "job": true + }, + "includeByName": {}, + "indexByName": {}, + "renameByName": {} } - }, - "overrides": [] - }, - "gridPos": { - "h": 6, - "w": 3, - "x": 3, - "y": 0 - }, - "id": 7, - "options": { - "colorMode": "value", - "graphMode": "area", - "justifyMode": "auto", - "orientation": "auto", - "percentChangeColorMode": "standard", - "reduceOptions": { - "calcs": [ - "last" - ], - "fields": "", - "values": false - }, - "showPercentChange": false, - "textMode": "value", - "wideLayout": true - }, - "pluginVersion": "11.6.0", - "targets": [ - { - "datasource": { - "type": "prometheus", - "uid": "cej25be7w5af4e" - }, - "disableTextWrap": false, - "editorMode": "builder", - "expr": "up", - "fullMetaSearch": false, - "includeNullMetadata": true, - "legendFormat": "__auto", - "range": true, - "refId": "A", - "useBackend": false } ], - "title": "Exporter Health", - "type": "stat" + "type": "table" }, { "datasource": { @@ -261,14 +167,18 @@ "pluginVersion": "11.6.0", "targets": [ { + "disableTextWrap": false, "editorMode": "code", "exemplar": false, - "expr": "100 * (sum_over_time(misskey_health[30d]) / count_over_time(misskey_health[30d]))", + "expr": "100 * (sum_over_time(misskey_health{instance=\"$instance\", job=\"$job\"}[30d]) / count_over_time(misskey_health{instance=\"$instance\", job=\"$job\"}[30d]))", "format": "time_series", + "fullMetaSearch": false, + "includeNullMetadata": true, "instant": false, "legendFormat": "__auto", "range": true, - "refId": "A" + "refId": "A", + "useBackend": false } ], "title": "Availability(30d)", @@ -311,7 +221,7 @@ "percentChangeColorMode": "standard", "reduceOptions": { "calcs": [ - "lastNotNull" + "last" ], "fields": "", "values": false @@ -384,26 +294,34 @@ "pluginVersion": "11.6.0", "targets": [ { + "disableTextWrap": false, "editorMode": "builder", - "expr": "misskey_notes_count", + "expr": "misskey_notes_count{instance=\"$instance\", job=\"$job\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, "instant": false, "legendFormat": "All", "range": true, - "refId": "A" + "refId": "A", + "useBackend": false }, { "datasource": { "type": "prometheus", "uid": "cej25be7w5af4e" }, + "disableTextWrap": false, "editorMode": "builder", "exemplar": false, - "expr": "misskey_original_notes_count", + "expr": "misskey_original_notes_count{instance=\"$instance\", job=\"$job\"}", + "fullMetaSearch": false, "hide": false, + "includeNullMetadata": true, "instant": false, "legendFormat": "Local", "range": true, - "refId": "B" + "refId": "B", + "useBackend": false } ], "title": "Note Count", @@ -459,29 +377,219 @@ "pluginVersion": "11.6.0", "targets": [ { - "editorMode": "code", - "expr": "misskey_users_count", + "disableTextWrap": false, + "editorMode": "builder", + "expr": "misskey_users_count{instance=\"$instance\", job=\"$job\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, "legendFormat": "All", "range": true, - "refId": "A" + "refId": "A", + "useBackend": false }, { "datasource": { "type": "prometheus", "uid": "cej25be7w5af4e" }, - "editorMode": "code", - "expr": "misskey_original_users_count", + "disableTextWrap": false, + "editorMode": "builder", + "expr": "misskey_original_users_count{instance=\"$instance\", job=\"$job\"}", + "fullMetaSearch": false, "hide": false, + "includeNullMetadata": true, "instant": false, "legendFormat": "Local", "range": true, - "refId": "B" + "refId": "B", + "useBackend": false } ], "title": "User Count", "type": "stat" }, + { + "datasource": { + "type": "prometheus", + "uid": "cej25be7w5af4e" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [ + { + "options": { + "0": { + "index": 1, + "text": "DOWN" + }, + "1": { + "index": 0, + "text": "UP" + } + }, + "type": "value" + } + ], + "noValue": "UNKNOWN", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + }, + { + "color": "red", + "value": 0 + }, + { + "color": "green", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 0, + "y": 3 + }, + "id": 1, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "auto", + "wideLayout": true + }, + "pluginVersion": "11.6.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cej25be7w5af4e" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "misskey_health{instance=\"$instance\", job=\"$job\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Health", + "type": "stat" + }, + { + "datasource": { + "type": "prometheus", + "uid": "cej25be7w5af4e" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "fieldMinMax": false, + "mappings": [ + { + "options": { + "0": { + "index": 1, + "text": "DOWN" + }, + "1": { + "index": 0, + "text": "UP" + } + }, + "type": "value" + } + ], + "noValue": "UNKNOWN", + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "red" + }, + { + "color": "red", + "value": 0 + }, + { + "color": "green", + "value": 1 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 3, + "y": 3 + }, + "id": 7, + "options": { + "colorMode": "value", + "graphMode": "area", + "justifyMode": "auto", + "orientation": "auto", + "percentChangeColorMode": "standard", + "reduceOptions": { + "calcs": [ + "last" + ], + "fields": "", + "values": false + }, + "showPercentChange": false, + "textMode": "value", + "wideLayout": true + }, + "pluginVersion": "11.6.0", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "cej25be7w5af4e" + }, + "disableTextWrap": false, + "editorMode": "builder", + "expr": "up{instance=\"$instance\", job=\"$job\"}", + "fullMetaSearch": false, + "includeNullMetadata": true, + "legendFormat": "__auto", + "range": true, + "refId": "A", + "useBackend": false + } + ], + "title": "Exporter Health", + "type": "stat" + }, { "datasource": { "type": "prometheus", @@ -711,7 +819,7 @@ }, "disableTextWrap": false, "editorMode": "builder", - "expr": "misskey_api_response_time_raw", + "expr": "misskey_api_response_time_raw{instance=\"$instance\", job=\"$job\"}", "fullMetaSearch": false, "hide": false, "includeNullMetadata": false, @@ -780,7 +888,7 @@ { "disableTextWrap": false, "editorMode": "builder", - "expr": "sum by(status) (misskey_jobqueue_jobs{type=\"deliver\"})", + "expr": "sum by(status) (misskey_jobqueue_jobs{type=\"deliver\", instance=\"$instance\", job=\"$job\"})", "fullMetaSearch": false, "includeNullMetadata": true, "legendFormat": "{{type}} {{status}}", @@ -847,7 +955,7 @@ { "disableTextWrap": false, "editorMode": "builder", - "expr": "sum by(status) (misskey_jobqueue_jobs{type=\"inbox\"})", + "expr": "sum by(status) (misskey_jobqueue_jobs{type=\"inbox\", instance=\"$instance\", job=\"$job\"})", "fullMetaSearch": false, "includeNullMetadata": true, "legendFormat": "{{type}} {{status}}", @@ -934,9 +1042,7 @@ ], "displayMode": "table", "placement": "right", - "showLegend": true, - "sortBy": "Max", - "sortDesc": true + "showLegend": true }, "tooltip": { "hideZeros": false, @@ -949,7 +1055,7 @@ { "disableTextWrap": false, "editorMode": "builder", - "expr": "misskey_jobqueue_jobs", + "expr": "misskey_jobqueue_jobs{instance=\"$instance\", job=\"$job\"}", "fullMetaSearch": false, "includeNullMetadata": true, "interval": "1", @@ -964,19 +1070,53 @@ } ], "preload": false, - "refresh": "auto", "schemaVersion": 41, "tags": [], "templating": { - "list": [] + "list": [ + { + "current": { + "text": "misskey-exporter:8080", + "value": "misskey-exporter:8080" + }, + "definition": "label_values(instance)", + "name": "instance", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(instance)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "type": "query" + }, + { + "current": { + "text": "process_exporter", + "value": "process_exporter" + }, + "definition": "label_values(job)", + "name": "job", + "options": [], + "query": { + "qryType": 1, + "query": "label_values(job)", + "refId": "PrometheusVariableQueryEditor-VariableQuery" + }, + "refresh": 1, + "regex": "", + "type": "query" + } + ] }, "time": { - "from": "now-15m", + "from": "now-3h", "to": "now" }, "timepicker": {}, "timezone": "browser", "title": "New dashboard", "uid": "eej5avfu4yyo0f", - "version": 25 + "version": 26 } \ No newline at end of file diff --git a/main.go b/main.go index 6b2a9bf..b20a644 100644 --- a/main.go +++ b/main.go @@ -154,6 +154,12 @@ var ( Name: "misskey_online_users", Help: "Online Users", }) + misskeyMeta = prometheus.NewGaugeVec( + prometheus.GaugeOpts{ + Name: "misskey_meta", + Help: "Misskey Instance Metadata", + }, + []string{"version"}) ) func main() { @@ -202,6 +208,7 @@ func main() { prometheus.MustRegister(misskeyApiResponseTime) prometheus.MustRegister(misskeyApiResponseTimeRaw) prometheus.MustRegister(misskeyOnlineUsers) + prometheus.MustRegister(misskeyMeta) handler := promhttp.Handler() @@ -216,6 +223,7 @@ func main() { go collectStats() go collectTimeline() go collectOnlineUsers() + go collectMeta() }() logrus.Error(server.ListenAndServe())