这段代码是两个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类型的切片。
  • 第二行定义了两个变量resperr,使用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
  • 第三至第十三行是一个条件判断语句块,当DbCallDatametricName等于'ActiveSession'时执行。
  • 第四行判断DbCallDataInstance是否等于'10.251.95.6:3306',如果是则给DbCallDatavalue赋值150,count_time赋值5。
  • 第五至第七行是一个else块,给DbCallDatavalue赋值50,count_time赋值4。
  • 第八至第十九行是一个条件判断语句块,当DbCallDatametricName等于'Delay'时执行。
  • 第九行判断DbCallDataInstance是否等于指定的多个IP地址,如果是则给DbCallDatavalue赋值12000,count_time赋值6。
  • 第十至第十二行是一个else块,给DbCallDatavalue赋值300,count_time赋值3。
  • 第十四至第二十行是一个条件判断语句块,当DbCallDatametricName等于'ConnUseRate'时执行。
  • 第十五行给DbCallDatavalue赋值70,count_time赋值3。
  • 第十六行给DbCallDatavalue赋值80,count_time赋值2,no_insert赋值1。
  • 第十八至第二十九行是一个条件判断语句块,当DbCallDatametricName等于'IO''SQL'时执行。
  • 第十九行给DbCallDatavalue赋值0,count_time赋值3。
  • 函数结束前的else块用于处理当db_alivefalse时的情况,给变量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
  • 第三至第六行是一个条件判断语句块,当DbCallDataInstance等于指定的多个IP地址时执行。
  • 第七至第十五行是一个条件判断语句块,当DbCallDatametricName不等于'TPS'且不满足其他特定条件时执行。
  • 第九至第十四行是一个else块,调用CallDbaRealTime方法传入DbCallData.message作为参数。
  • 第十六行调用PushMessage方法传入DbCallData.message作为参数。
  • 第十七行使用fmt.Sprintf方法将update_sql格式化为一个字符串,并调用db_exec方法执行该SQL语句。
  • 函数的最后部分是一个else块,用于处理obj.db_errorfalse的情况。
  • 第十八至第二十行是一个条件判断语句块,当DbCallDatano_insert不等于1时执行。
  • 第二十一行使用fmt.Sprintf方法将insert_sql格式化为一个字符串,并调用db_exec方法执行该SQL语句。

总结

这两个函数共同完成了一个功能:获取HTTP数据,并根据数据内容调用数据库接口,进行相关数据的处理和存储。代码中的详细注释和代码结构有助于理解代码的逻辑和功能。

Go语言代码解析:HTTP数据获取和数据库调用

原文地址: https://www.cveoy.top/t/topic/KaV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录