云mysql前后端完成
parent
c39bee1e21
commit
d22f834f87
|
@ -1,4 +1,51 @@
|
||||||
from config import consul_token,consul_url
|
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):
|
def ecs_config(services_list,ostype_list):
|
||||||
consul_server = consul_url.split("/")[2]
|
consul_server = consul_url.split("/")[2]
|
||||||
job_dict = {'linux':'node_exporter','windows':'windows_exporter'}
|
job_dict = {'linux':'node_exporter','windows':'windows_exporter'}
|
||||||
|
@ -39,6 +86,70 @@ def ecs_config(services_list,ostype_list):
|
||||||
"""
|
"""
|
||||||
configs = configs + config_str
|
configs = configs + config_str
|
||||||
return {'code': 20000,'configs': configs }
|
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():
|
def get_rules():
|
||||||
rules = """
|
rules = """
|
||||||
groups:
|
groups:
|
||||||
|
|
Binary file not shown.
|
@ -46,8 +46,18 @@ class Nodes(Resource):
|
||||||
serivces = i.split("/")
|
serivces = i.split("/")
|
||||||
services_list.append(f'{serivces[0]}_{serivces[1]}_{serivces[2]}')
|
services_list.append(f'{serivces[0]}_{serivces[1]}_{serivces[2]}')
|
||||||
return {'code': 20000,'services_list': sorted(set(services_list))}
|
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':
|
elif stype == 'rules':
|
||||||
return gen_config.get_rules()
|
return gen_config.get_rules()
|
||||||
|
elif stype == 'rdsrules':
|
||||||
|
return gen_config.get_rdsrules()
|
||||||
elif stype == 'cstecsconf':
|
elif stype == 'cstecsconf':
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
iid = args['iid']
|
iid = args['iid']
|
||||||
|
@ -76,6 +86,10 @@ class Nodes(Resource):
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
services_dict = args['services_dict']
|
services_dict = args['services_dict']
|
||||||
return gen_config.ecs_config(services_dict['services_list'],services_dict['ostype_list'])
|
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':
|
elif stype == 'cstecs':
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
cst_ecs_dict = args['cst_ecs_dict']
|
cst_ecs_dict = args['cst_ecs_dict']
|
||||||
|
|
|
@ -59,6 +59,26 @@ export function getServicesList() {
|
||||||
method: 'get'
|
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) {
|
export function getConfig(services_dict) {
|
||||||
return request({
|
return request({
|
||||||
url: '/api/nodes/config',
|
url: '/api/nodes/config',
|
||||||
|
|
Binary file not shown.
|
@ -4,16 +4,12 @@
|
||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<el-col :span="12" :offset="6">
|
<el-col :span="12" :offset="6">
|
||||||
<el-card shadow="always" style="text-align: center">
|
<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-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<br>
|
<br>
|
||||||
<div class="block">
|
<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>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -3,10 +3,9 @@
|
||||||
<el-select v-model="services" multiple placeholder="请选择需要生成配置的服务" filterable collapse-tags clearable style="width: 350px" class="filter-item">
|
<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-option v-for="item in services_list" :key="item" :label="item" :value="item" />
|
||||||
</el-select>
|
</el-select>
|
||||||
<el-select v-model="ostype" multiple placeholder="请选择系统" filterable clearable class="filter-item">
|
<font color="#ff0000">*</font>MySQLd_Exporter IP端口
|
||||||
<el-option v-for="item in ostype_list" :key="item" :label="item" :value="item" />
|
<el-input v-model="exporter" placeholder="x.x.x.x:9104" clearable style="width: 200px;" class="filter-item" />
|
||||||
</el-select>
|
<el-button class="filter-item" type="primary" icon="el-icon-magic-stick" @click="fetchRdsConfig">
|
||||||
<el-button class="filter-item" type="primary" icon="el-icon-magic-stick" @click="fetchEcsConfig">
|
|
||||||
生成配置
|
生成配置
|
||||||
</el-button>
|
</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">
|
<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>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { getServicesList, getConfig } from '@/api/node-exporter'
|
import { getRdsServicesList, getRdsConfig } from '@/api/node-exporter'
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -25,13 +24,13 @@ export default {
|
||||||
services: [],
|
services: [],
|
||||||
ostype: [],
|
ostype: [],
|
||||||
services_list: [],
|
services_list: [],
|
||||||
ostype_list: ['linux', 'windows'],
|
|
||||||
services_dict: {},
|
services_dict: {},
|
||||||
|
exporter: '',
|
||||||
configs: ''
|
configs: ''
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
this.fetchEcsList()
|
this.fetchRdsList()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
onCopy() {
|
onCopy() {
|
||||||
|
@ -43,19 +42,18 @@ export default {
|
||||||
onError() {
|
onError() {
|
||||||
this.$message.error('复制失败!')
|
this.$message.error('复制失败!')
|
||||||
},
|
},
|
||||||
fetchEcsList() {
|
fetchRdsList() {
|
||||||
this.listLoading = true
|
this.listLoading = true
|
||||||
getServicesList().then(response => {
|
getRdsServicesList().then(response => {
|
||||||
this.services_list = response.services_list
|
this.services_list = response.services_list
|
||||||
this.services_list.push('selfnode_exporter')
|
|
||||||
this.listLoading = false
|
this.listLoading = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
fetchEcsConfig() {
|
fetchRdsConfig() {
|
||||||
this.listLoading = true
|
this.listLoading = true
|
||||||
this.services_dict.services_list = this.services
|
this.services_dict.services_list = this.services
|
||||||
this.services_dict.ostype_list = this.ostype
|
this.services_dict.exporter = this.exporter
|
||||||
getConfig(this.services_dict).then(response => {
|
getRdsConfig(this.services_dict).then(response => {
|
||||||
this.configs = response.configs
|
this.configs = response.configs
|
||||||
this.listLoading = false
|
this.listLoading = false
|
||||||
})
|
})
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { getRules } from '@/api/node-exporter'
|
import { getRdsRules } from '@/api/node-exporter'
|
||||||
export default {
|
export default {
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
@ -31,7 +31,7 @@ export default {
|
||||||
},
|
},
|
||||||
fetchRules() {
|
fetchRules() {
|
||||||
this.listLoading = true
|
this.listLoading = true
|
||||||
getRules().then(response => {
|
getRdsRules().then(response => {
|
||||||
this.rules = response.rules
|
this.rules = response.rules
|
||||||
this.listLoading = false
|
this.listLoading = false
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue