diff --git a/flask-consul/units/gen_config.py b/flask-consul/units/gen_config.py index 88f25a0..dfacd4c 100644 --- a/flask-consul/units/gen_config.py +++ b/flask-consul/units/gen_config.py @@ -1,4 +1,51 @@ from config import consul_token,consul_url + +def rds_config(services_list, exporter): + consul_server = consul_url.split("/")[2] + configs = f""" + - job_name: multi_mysqld_exporter + scrape_interval: 15s + scrape_timeout: 5s + metrics_path: /probe + consul_sd_configs: + - server: '{consul_server}' + token: '{consul_token}' + refresh_interval: 30s + services: {services_list} + relabel_configs: + - source_labels: [__meta_consul_service_address,__meta_consul_service_port] + regex: ([^:]+)(?::\d+)?;(\d+) + target_label: __param_target + replacement: $1:$2 + - source_labels: [__param_target] + target_label: instance + - target_label: __address__ + replacement: {exporter} + - source_labels: ['__meta_consul_service_metadata_vendor'] + target_label: vendor + - source_labels: ['__meta_consul_service_metadata_region'] + target_label: region + - source_labels: ['__meta_consul_service_metadata_group'] + target_label: group + - source_labels: ['__meta_consul_service_metadata_account'] + target_label: account + - source_labels: ['__meta_consul_service_metadata_name'] + target_label: name + - source_labels: ['__meta_consul_service_metadata_iid'] + target_label: iid + - source_labels: ['__meta_consul_service_metadata_exp'] + target_label: exp + - source_labels: ['__meta_consul_service_metadata_cpu'] + target_label: cpu + - source_labels: ['__meta_consul_service_metadata_mem'] + target_label: mem + - source_labels: ['__meta_consul_service_metadata_disk'] + target_label: disk + - source_labels: ['__meta_consul_service_metadata_itype'] + target_label: itype +""" + return {'code': 20000,'configs': configs } + def ecs_config(services_list,ostype_list): consul_server = consul_url.split("/")[2] job_dict = {'linux':'node_exporter','windows':'windows_exporter'} @@ -39,6 +86,70 @@ def ecs_config(services_list,ostype_list): """ configs = configs + config_str return {'code': 20000,'configs': configs } + +def get_rdsrules(): + rules = """ +groups: +- name: MySQL-Alert + rules: + - alert: MySQL_is_down + expr: mysql_up == 0 + for: 3m + labels: + severity: critical + annotations: + description: "{{ $labels.group }}_{{ $labels.name }}:MySQL database is down. \\n> {{ $labels.iid }}" + + - alert: MySQL_慢查询过多 + expr: delta(mysql_global_status_slow_queries[1m]) > 60 + for: 1m + labels: + severity: critical + annotations: + description: "{{ $labels.group }}_{{ $labels.name }}:每分钟慢查询:{{ $value }} \\n> {{ $labels.iid }}" + + - alert: mysql_当前活跃的连接数过多 + expr: mysql_global_status_threads_running > 100 + for: 1m + labels: + severity: critical + annotations: + description: "{{ $labels.group }}_{{ $labels.name }}:当前活跃的连接数:{{ $value }} \\n> {{ $labels.iid }}" + + - alert: mysql_当前updating状态的线程过多 + expr: mysql_global_status_threads_running > 100 + for: 1m + labels: + severity: critical + annotations: + description: "{{ $labels.group }}_{{ $labels.name }}:当前updating状态的线程:{{ $value }} \\n> {{ $labels.iid }}" + + - alert: MySQL_High_QPS + expr: irate(mysql_global_status_questions[3m]) > 30000 + for: 2m + labels: + severity: warning + annotations: + description: "{{ $labels.group }}_{{ $labels.name }}:Mysql QPS:{{ $value | humanize }} \\n> {{ $labels.iid }}" + + - alert: MySQL_Too_Many_Connections + expr: irate(mysql_global_status_threads_connected[3m]) > 1000 + for: 2m + labels: + severity: warning + annotations: + description: "{{ $labels.group }}_{{ $labels.name }}:Mysql Connections:{{ $value | humanize }} \\n> {{ $labels.iid }}" + + - alert: MySQL_is_Restart + expr: mysql_global_status_uptime <600 + for: 2m + labels: + severity: critical + annotations: + description: "{{ $labels.group }}_{{ $labels.name }}:MySQL database is Restart. \\n> {{ $labels.iid }}" +""" + return {"code": 20000, "rules": rules} + def get_rules(): rules = """ groups: diff --git a/flask-consul/views/.nodes.py.swp b/flask-consul/views/.nodes.py.swp deleted file mode 100644 index fb4d4c6..0000000 Binary files a/flask-consul/views/.nodes.py.swp and /dev/null differ diff --git a/flask-consul/views/nodes.py b/flask-consul/views/nodes.py index d2be7cf..5d6af09 100644 --- a/flask-consul/views/nodes.py +++ b/flask-consul/views/nodes.py @@ -46,8 +46,18 @@ class Nodes(Resource): serivces = i.split("/") services_list.append(f'{serivces[0]}_{serivces[1]}_{serivces[2]}') return {'code': 20000,'services_list': sorted(set(services_list))} + elif stype == 'rds_services': + jobecs = consul_kv.get_keys_list('ConsulManager/jobs') + jobecs_list = [i.split('/jobs/')[1] for i in jobecs if '/rds/' in i] + services_list = [] + for i in jobecs_list: + serivces = i.split("/") + services_list.append(f'{serivces[0]}_{serivces[1]}_{serivces[2]}') + return {'code': 20000,'services_list': sorted(set(services_list))} elif stype == 'rules': return gen_config.get_rules() + elif stype == 'rdsrules': + return gen_config.get_rdsrules() elif stype == 'cstecsconf': args = parser.parse_args() iid = args['iid'] @@ -76,6 +86,10 @@ class Nodes(Resource): args = parser.parse_args() services_dict = args['services_dict'] return gen_config.ecs_config(services_dict['services_list'],services_dict['ostype_list']) + elif stype == 'rdspconfig': + args = parser.parse_args() + services_dict = args['services_dict'] + return gen_config.rds_config(services_dict['services_list'],services_dict['exporter']) elif stype == 'cstecs': args = parser.parse_args() cst_ecs_dict = args['cst_ecs_dict'] diff --git a/vue-consul/src/api/node-exporter.js b/vue-consul/src/api/node-exporter.js index 946dd33..70d8d36 100644 --- a/vue-consul/src/api/node-exporter.js +++ b/vue-consul/src/api/node-exporter.js @@ -59,6 +59,26 @@ export function getServicesList() { method: 'get' }) } +export function getRdsServicesList() { + return request({ + url: '/api/nodes/rds_services', + method: 'get' + }) +} + +export function getRdsConfig(services_dict) { + return request({ + url: '/api/nodes/rdspconfig', + method: 'post', + data: { services_dict } + }) +} +export function getRdsRules() { + return request({ + url: '/api/nodes/rdsrules', + method: 'get' + }) +} export function getConfig(services_dict) { return request({ url: '/api/nodes/config', diff --git a/vue-consul/src/views/node-exporter/.jobs.vue.swp b/vue-consul/src/views/node-exporter/.jobs.vue.swp deleted file mode 100644 index 8d38108..0000000 Binary files a/vue-consul/src/views/node-exporter/.jobs.vue.swp and /dev/null differ diff --git a/vue-consul/src/views/rds/grafana.vue b/vue-consul/src/views/rds/grafana.vue index a1b397f..1954b13 100644 --- a/vue-consul/src/views/rds/grafana.vue +++ b/vue-consul/src/views/rds/grafana.vue @@ -4,16 +4,12 @@ - Grafana 看板详情: - https://grafana.com/grafana/dashboards/8919

- Grafana 看板ID:8919 + 设计中,敬请期待

- -
diff --git a/vue-consul/src/views/rds/pconfig.vue b/vue-consul/src/views/rds/pconfig.vue index 93547eb..6f36d0a 100644 --- a/vue-consul/src/views/rds/pconfig.vue +++ b/vue-consul/src/views/rds/pconfig.vue @@ -3,10 +3,9 @@ - - - - +   *MySQLd_Exporter IP端口 +    + 生成配置 @@ -17,7 +16,7 @@