Go语言代码解析:HTTP数据获取和数据库调用
这段代码是两个Go语言函数,分别用于获取HTTP数据并进行处理,以及调用数据库接口。
1. get_http_data 函数
func get_http_data(query_sql string) ( []Result) {
resp,err := http.Get(query_sql)
if err != nil {
fmt.Println(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
var TempResultData MetricJsonData
err = json.Unmarshal([]byte(body), &TempResultData)
if err != nil {
fmt.Println(err)
}
ResultsData := TempResultData.Data.Result
return ResultsData
}
- 第一行是函数定义,函数名为
get_http_data,参数是一个字符串类型的query_sql,返回值是一个Result类型的切片。 - 第二行定义了两个变量
resp和err,使用http.Get方法发送GET请求并将返回的响应和错误赋值给这两个变量。 - 第三行使用
defer关键字延迟执行resp.Body.Close(),确保在函数返回前关闭响应的Body。 - 第四行使用
ioutil.ReadAll方法读取resp.Body的内容,并将读取的内容赋值给变量body。 - 第五行定义了一个名为
TempResultData的变量,类型为MetricJsonData。 - 第六行使用
json.Unmarshal方法将body转换为字节切片,并将结果赋值给TempResultData。 - 第七行将
TempResultData中的Data字段的Result字段赋值给ResultsData。 - 最后一行返回
ResultsData。
2. CallDba 函数
func CallDba(DbCallData DbCallObj) {
var db_alive = telnet_status(monitorDBAdrr)
if db_alive == true || telnet_status(monitorDBAdrr) == true || telnet_status(monitorDBAdrr) == true {
if DbCallData.metricName == 'ActiveSession' {
if DbCallData.Instance == '10.251.95.6:3306' {
DbCallData.value = 150
DbCallData.count_time = 5
DbCallInterface( DbCallData)
}else {
DbCallData.value = 50
DbCallData.count_time = 4
DbCallInterface( DbCallData)
}
if DbCallData.metricName == 'Delay' {
if DbCallData.Instance == ' 10.251.95.10:3306' || DbCallData.Instance == '10.210.14.70:3306' || DbCallData.Instance == '10.210.14.2:3306' || DbCallData.Instance == '10.208.14.41:3306' {
DbCallData.value = 12000
DbCallData.count_time = 6
DbCallInterface( DbCallData)
} else {
DbCallData.value = 300
DbCallData.count_time = 3
DbCallInterface( DbCallData)
}
if DbCallData.metricName == 'ConnUseRate' {
DbCallData.value = 70
DbCallData.count_time = 3
DbCallInterface( DbCallData)
DbCallData.value = 80
DbCallData.count_time = 2
DbCallData.no_insert = 1
DbCallInterface( DbCallData)
}
if DbCallData.metricName == 'IO' || DbCallData.metricName == 'SQL' {
DbCallData.value = 0 // 小与
DbCallData.count_time = 3
DbCallInterface( DbCallData)
}
} else {
monitor_db_down := fmt.Sprintf('Monitor DB: %s is Down', monitorDBAdrr)
CallDbaRealTime(monitor_db_down)
CallDbaRealTime(DbCallData.message)
}
}
- 第一行定义了一个名为
db_alive的变量,调用了telnet_status方法并将monitorDBAdrr作为参数传入。 - 第二行通过多个条件判断语句,判断
db_alive是否为true。 - 第三至第十三行是一个条件判断语句块,当
DbCallData的metricName等于'ActiveSession'时执行。 - 第四行判断
DbCallData的Instance是否等于'10.251.95.6:3306',如果是则给DbCallData的value赋值150,count_time赋值5。 - 第五至第七行是一个
else块,给DbCallData的value赋值50,count_time赋值4。 - 第八至第十九行是一个条件判断语句块,当
DbCallData的metricName等于'Delay'时执行。 - 第九行判断
DbCallData的Instance是否等于指定的多个IP地址,如果是则给DbCallData的value赋值12000,count_time赋值6。 - 第十至第十二行是一个
else块,给DbCallData的value赋值300,count_time赋值3。 - 第十四至第二十行是一个条件判断语句块,当
DbCallData的metricName等于'ConnUseRate'时执行。 - 第十五行给
DbCallData的value赋值70,count_time赋值3。 - 第十六行给
DbCallData的value赋值80,count_time赋值2,no_insert赋值1。 - 第十八至第二十九行是一个条件判断语句块,当
DbCallData的metricName等于'IO'或'SQL'时执行。 - 第十九行给
DbCallData的value赋值0,count_time赋值3。 - 函数结束前的
else块用于处理当db_alive为false时的情况,给变量monitor_db_down赋值一个字符串,并调用CallDbaRealTime方法传入该字符串作为参数,然后再调用CallDbaRealTime方法传入DbCallData.message作为参数。
3. DbCallInterface 函数
func DbCallInterface( DbCallData DbCallObj ) {
obj := GetCallStatus( DbCallData)
if obj.obj_status == true {
if DbCallData.Instance == '10.214.132.23:3307' || DbCallData.Instance == '10.214.131.18:3307' || DbCallData.Instance == '10.214.131.19:3307' {
return
}
if strings.Contains( DbCallData.Instance, '10.215.1.249') || strings.Contains( DbCallData.Instance, '10.215.1.250') || strings.Contains( DbCallData.Instance, '10.215.1.251') || strings.Contains( DbCallData.Instance, '10.215.1.252') || strings.Contains( DbCallData.Instance, '10.215.1.253') || strings.Contains( DbCallData.Instance, '10.215.1.254') || DbCallData.Instance == '10.214.132.23:3307' || DbCallData.Instance == '10.214.131.18:3307' || DbCallData.Instance == '10.214.131.19:3307'{
return
}
if DbCallData.metricName != 'TPS' && !(DbCallData.Instance == '10.247.9.105:3307' && DbCallData.metricName == 'Delay') && !(DbCallData.Instance == '10.247.8.102:3307' && DbCallData.metricName == 'Delay') && DbCallData.Instance != '10.211.138.164.3307' && DbCallData.Instance != '10.211.138.163.3307' && DbCallData.Instance != '10.251.95.2' && DbCallData.Instance != '10.251.128.44:3307' && DbCallData.Instance != '10.251.130.2:3307' && DbCallData.Instance == '10.251.95.6:3306' {
// CallDbaRealTime( DbCallData.message)
}
CallDbaRealTime( DbCallData.message)
PushMessage( DbCallData.message)
update_sql := fmt.Sprintf('update db_call_log set status=1 where create_time >= date_sub(now(), interval 10 minute) and status = 0 and metricName = %q and Instance = %q', DbCallData.metricName, DbCallData.Instance)
db_exec( update_sql)
} else {
if obj.db_error == false {
if DbCallData.no_insert != 1 {
insert_sql := fmt.Sprintf('INSERT INTO db_call_log(`metricName`,`Instance`,`value`,`status`) VALUES ( %q,%q, %f, %d)',DbCallData.metricName,DbCallData.Instance,DbCallData.data_value, 0)
db_exec( insert_sql)
}
}
}
}
- 第一行调用了
GetCallStatus方法并将DbCallData作为参数传入,将返回结果赋值给变量obj。 - 第三至第六行是一个条件判断语句块,当
DbCallData的Instance等于指定的多个IP地址时执行。 - 第七至第十五行是一个条件判断语句块,当
DbCallData的metricName不等于'TPS'且不满足其他特定条件时执行。 - 第九至第十四行是一个
else块,调用CallDbaRealTime方法传入DbCallData.message作为参数。 - 第十六行调用
PushMessage方法传入DbCallData.message作为参数。 - 第十七行使用
fmt.Sprintf方法将update_sql格式化为一个字符串,并调用db_exec方法执行该SQL语句。 - 函数的最后部分是一个
else块,用于处理obj.db_error为false的情况。 - 第十八至第二十行是一个条件判断语句块,当
DbCallData的no_insert不等于1时执行。 - 第二十一行使用
fmt.Sprintf方法将insert_sql格式化为一个字符串,并调用db_exec方法执行该SQL语句。
总结
这两个函数共同完成了一个功能:获取HTTP数据,并根据数据内容调用数据库接口,进行相关数据的处理和存储。代码中的详细注释和代码结构有助于理解代码的逻辑和功能。
原文地址: https://www.cveoy.top/t/topic/KaV 著作权归作者所有。请勿转载和采集!