云mysql前后端完成

pull/42/head
StarsL.cn 2022-10-31 01:36:57 +08:00
parent c39bee1e21
commit d22f834f87
8 changed files with 159 additions and 20 deletions

View File

@ -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.

View File

@ -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']

View File

@ -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',

View File

@ -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>

View File

@ -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">
&nbsp;&nbsp;<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" />&nbsp;&nbsp;
<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
})

View File

@ -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
})