云mysql前后端完成
parent
c39bee1e21
commit
d22f834f87
|
@ -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:
|
||||
|
|
Binary file not shown.
|
@ -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']
|
||||
|
|
|
@ -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',
|
||||
|
|
Binary file not shown.
|
@ -4,16 +4,12 @@
|
|||
<el-row :gutter="20">
|
||||
<el-col :span="12" :offset="6">
|
||||
<el-card shadow="always" style="text-align: center">
|
||||
Grafana 看板详情:
|
||||
<el-link href="https://grafana.com/grafana/dashboards/8919" target="_blank" type="primary">https://grafana.com/grafana/dashboards/8919</el-link><br><br>
|
||||
Grafana 看板ID:<strong>8919</strong>
|
||||
设计中,敬请期待
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<br>
|
||||
<div class="block">
|
||||
<el-image style="width: 100%; height: 100%" src="/node1.png" />
|
||||
<el-image style="width: 100%; height: 100%" src="/node2.png" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -3,10 +3,9 @@
|
|||
<el-select v-model="services" multiple placeholder="请选择需要生成配置的服务" filterable collapse-tags clearable style="width: 350px" class="filter-item">
|
||||
<el-option v-for="item in services_list" :key="item" :label="item" :value="item" />
|
||||
</el-select>
|
||||
<el-select v-model="ostype" multiple placeholder="请选择系统" filterable clearable class="filter-item">
|
||||
<el-option v-for="item in ostype_list" :key="item" :label="item" :value="item" />
|
||||
</el-select>
|
||||
<el-button class="filter-item" type="primary" icon="el-icon-magic-stick" @click="fetchEcsConfig">
|
||||
<font color="#ff0000">*</font>MySQLd_Exporter IP端口
|
||||
<el-input v-model="exporter" placeholder="x.x.x.x:9104" clearable style="width: 200px;" class="filter-item" />
|
||||
<el-button class="filter-item" type="primary" icon="el-icon-magic-stick" @click="fetchRdsConfig">
|
||||
生成配置
|
||||
</el-button>
|
||||
<el-button v-clipboard:copy="configs" v-clipboard:success="onCopy" v-clipboard:error="onError" class="filter-item" type="warning" icon="el-icon-document-copy">
|
||||
|
@ -17,7 +16,7 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { getServicesList, getConfig } from '@/api/node-exporter'
|
||||
import { getRdsServicesList, getRdsConfig } from '@/api/node-exporter'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
|
@ -25,13 +24,13 @@ export default {
|
|||
services: [],
|
||||
ostype: [],
|
||||
services_list: [],
|
||||
ostype_list: ['linux', 'windows'],
|
||||
services_dict: {},
|
||||
exporter: '',
|
||||
configs: ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.fetchEcsList()
|
||||
this.fetchRdsList()
|
||||
},
|
||||
methods: {
|
||||
onCopy() {
|
||||
|
@ -43,19 +42,18 @@ export default {
|
|||
onError() {
|
||||
this.$message.error('复制失败!')
|
||||
},
|
||||
fetchEcsList() {
|
||||
fetchRdsList() {
|
||||
this.listLoading = true
|
||||
getServicesList().then(response => {
|
||||
getRdsServicesList().then(response => {
|
||||
this.services_list = response.services_list
|
||||
this.services_list.push('selfnode_exporter')
|
||||
this.listLoading = false
|
||||
})
|
||||
},
|
||||
fetchEcsConfig() {
|
||||
fetchRdsConfig() {
|
||||
this.listLoading = true
|
||||
this.services_dict.services_list = this.services
|
||||
this.services_dict.ostype_list = this.ostype
|
||||
getConfig(this.services_dict).then(response => {
|
||||
this.services_dict.exporter = this.exporter
|
||||
getRdsConfig(this.services_dict).then(response => {
|
||||
this.configs = response.configs
|
||||
this.listLoading = false
|
||||
})
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
</template>
|
||||
|
||||
<script>
|
||||
import { getRules } from '@/api/node-exporter'
|
||||
import { getRdsRules } from '@/api/node-exporter'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
|
@ -31,7 +31,7 @@ export default {
|
|||
},
|
||||
fetchRules() {
|
||||
this.listLoading = true
|
||||
getRules().then(response => {
|
||||
getRdsRules().then(response => {
|
||||
this.rules = response.rules
|
||||
this.listLoading = false
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue