2021-01-03 18:15:44 +05:30
package druidQuery
import (
"encoding/json"
"fmt"
2021-05-05 13:04:09 +05:30
"strconv"
2021-01-03 18:15:44 +05:30
"time"
"go.signoz.io/query-service/constants"
"go.signoz.io/query-service/model"
"go.uber.org/zap"
)
func GetOperations ( client * SqlClient , serviceName string ) ( * [ ] string , error ) {
2021-04-23 13:37:32 +05:30
sqlQuery := fmt . Sprintf ( ` SELECT DISTINCT(Name) FROM %s WHERE ServiceName='%s' AND __time > CURRENT_TIMESTAMP - INTERVAL '1' DAY ` , constants . DruidDatasource , serviceName )
2021-01-03 18:15:44 +05:30
// zap.S().Debug(sqlQuery)
response , err := client . Query ( sqlQuery , "array" )
if err != nil {
zap . S ( ) . Error ( sqlQuery , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// zap.S().Info(string(response))
res := new ( [ ] [ ] string )
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
var getOperationsReponse [ ] string
for _ , item := range * res {
getOperationsReponse = append ( getOperationsReponse , item [ 0 ] )
}
getOperationsReponse = getOperationsReponse [ 1 : ]
return & getOperationsReponse , nil
}
func GetServicesList ( client * SqlClient ) ( * [ ] string , error ) {
2021-05-05 00:03:57 +05:30
sqlQuery := fmt . Sprintf ( ` SELECT DISTINCT(ServiceName) FROM %s WHERE __time > CURRENT_TIMESTAMP - INTERVAL '1' DAY ` , constants . DruidDatasource )
2021-01-03 18:15:44 +05:30
// zap.S().Debug(sqlQuery)
response , err := client . Query ( sqlQuery , "array" )
if err != nil {
zap . S ( ) . Error ( sqlQuery , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
2021-01-09 19:10:34 +05:30
// zap.S().Info(string(response))
2021-01-03 18:15:44 +05:30
res := new ( [ ] [ ] string )
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
var servicesListReponse [ ] string
for _ , item := range * res {
servicesListReponse = append ( servicesListReponse , item [ 0 ] )
}
servicesListReponse = servicesListReponse [ 1 : ]
return & servicesListReponse , nil
}
2021-05-22 19:51:56 +05:30
func GetTags ( client * SqlClient , serviceName string ) ( * [ ] model . TagItem , error ) {
2021-01-03 18:15:44 +05:30
var sqlQuery string
if len ( serviceName ) != 0 {
sqlQuery = fmt . Sprintf ( ` SELECT TagsKeys as tagKeys, Count(TagsKeys) as "tagCount" FROM %s WHERE "ServiceName"='%s' AND "__time" > CURRENT_TIMESTAMP - INTERVAL '1' DAY GROUP BY TagsKeys ORDER BY tagCount DESC LIMIT 100 ` , constants . DruidDatasource , serviceName )
} else {
sqlQuery = fmt . Sprintf ( ` SELECT TagsKeys as tagKeys, Count(TagsKeys) as "tagCount" FROM %s WHERE "__time" > CURRENT_TIMESTAMP - INTERVAL '1' DAY GROUP BY TagsKeys ORDER BY tagCount DESC LIMIT 100 ` , constants . DruidDatasource )
}
// zap.S().Debug(sqlQuery)
response , err := client . Query ( sqlQuery , "object" )
if err != nil {
zap . S ( ) . Error ( sqlQuery , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// zap.S().Info(string(response))
2021-05-22 19:51:56 +05:30
res := new ( [ ] model . TagItem )
2021-01-03 18:15:44 +05:30
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
tagResponse := ( * res ) [ 1 : ]
return & tagResponse , nil
}
2021-05-31 11:14:11 +05:30
func GetTopEndpoints ( client * SqlClient , query * model . GetTopEndpointsParams ) ( * [ ] model . TopEndpointsItem , error ) {
2021-01-03 18:15:44 +05:30
2021-05-31 11:14:11 +05:30
sqlQuery := fmt . Sprintf ( ` SELECT APPROX_QUANTILE_DS("QuantileDuration", 0.5) as p50, APPROX_QUANTILE_DS("QuantileDuration", 0.95) as p95, APPROX_QUANTILE_DS("QuantileDuration", 0.99) as p99, COUNT(SpanId) as numCalls, Name FROM "%s" WHERE "__time" >= '%s' AND "__time" <= '%s' AND "Kind"='2' and "ServiceName"='%s' GROUP BY Name ` , constants . DruidDatasource , query . StartTime , query . EndTime , query . ServiceName )
2021-01-03 18:15:44 +05:30
// zap.S().Debug(sqlQuery)
response , err := client . Query ( sqlQuery , "object" )
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// zap.S().Info(string(response))
2021-05-31 11:14:11 +05:30
res := new ( [ ] model . TopEndpointsItem )
2021-01-03 18:15:44 +05:30
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
topEnpointsResponse := ( * res ) [ 1 : ]
return & topEnpointsResponse , nil
}
2021-05-22 19:51:56 +05:30
func GetUsage ( client * SqlClient , query * model . GetUsageParams ) ( * [ ] model . UsageItem , error ) {
2021-01-03 18:15:44 +05:30
var sqlQuery string
if len ( query . ServiceName ) != 0 {
2021-04-23 13:37:32 +05:30
sqlQuery = fmt . Sprintf ( ` SELECT TIME_FLOOR(__time, '%s') as "time", COUNT(SpanId) as "count" FROM "%s" WHERE "__time" >= '%s' and "__time" <= '%s' and "ServiceName"='%s' GROUP BY TIME_FLOOR(__time, '%s') ` , query . Period , constants . DruidDatasource , query . StartTime , query . EndTime , query . ServiceName , query . Period )
2021-01-03 18:15:44 +05:30
} else {
2021-04-23 13:37:32 +05:30
sqlQuery = fmt . Sprintf ( ` SELECT TIME_FLOOR(__time, '%s') as "time", COUNT(SpanId) as "count" FROM "%s" WHERE "__time" >= '%s' and "__time" <= '%s' GROUP BY TIME_FLOOR(__time, '%s') ` , query . Period , constants . DruidDatasource , query . StartTime , query . EndTime , query . Period )
2021-01-03 18:15:44 +05:30
}
// zap.S().Debug(sqlQuery)
response , err := client . Query ( sqlQuery , "object" )
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// zap.S().Info(string(response))
2021-05-22 19:51:56 +05:30
res := new ( [ ] model . UsageItem )
2021-01-03 18:15:44 +05:30
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
for i , _ := range * res {
timeObj , _ := time . Parse ( time . RFC3339Nano , ( * res ) [ i ] . Time )
( * res ) [ i ] . Timestamp = int64 ( timeObj . UnixNano ( ) )
( * res ) [ i ] . Time = ""
}
usageResponse := ( * res ) [ 1 : ]
return & usageResponse , nil
}
2021-05-22 19:51:56 +05:30
func GetServiceExternalAvgDuration ( client * SqlClient , query * model . GetServiceOverviewParams ) ( * [ ] model . ServiceExternalItem , error ) {
2021-04-26 21:55:11 +05:30
sqlQuery := fmt . Sprintf ( ` SELECT TIME_FLOOR ( __time , ' % s ' ) as "time" , AVG ( DurationNano ) as "avgDuration" FROM % s WHERE ServiceName = ' % s ' AND Kind = '3' AND ExternalHttpUrl != ' ' AND "__time" >= ' % s ' AND "__time" <= ' % s '
2021-05-02 21:48:55 +05:30
GROUP BY TIME_FLOOR ( __time , ' % s ' ) ` , query . Period , constants . DruidDatasource , query . ServiceName , query . StartTime , query . EndTime , query . Period )
2021-04-26 21:55:11 +05:30
// zap.S().Debug(sqlQuery)
response , err := client . Query ( sqlQuery , "object" )
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// responseStr := string(response)
// zap.S().Info(responseStr)
2021-05-22 19:51:56 +05:30
res := new ( [ ] model . ServiceExternalItem )
2021-04-26 21:55:11 +05:30
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
for i , _ := range * res {
timeObj , _ := time . Parse ( time . RFC3339Nano , ( * res ) [ i ] . Time )
( * res ) [ i ] . Timestamp = int64 ( timeObj . UnixNano ( ) )
( * res ) [ i ] . Time = ""
( * res ) [ i ] . CallRate = float32 ( ( * res ) [ i ] . NumCalls ) / float32 ( query . StepSeconds )
}
servicesExternalResponse := ( * res ) [ 1 : ]
return & servicesExternalResponse , nil
}
2021-05-22 19:51:56 +05:30
func GetServiceExternalErrors ( client * SqlClient , query * model . GetServiceOverviewParams ) ( * [ ] model . ServiceExternalItem , error ) {
2021-04-26 21:55:11 +05:30
sqlQuery := fmt . Sprintf ( ` SELECT TIME_FLOOR ( __time , ' % s ' ) as "time" , COUNT ( SpanId ) as "numCalls" , ExternalHttpUrl as externalHttpUrl FROM % s WHERE ServiceName = ' % s ' AND Kind = '3' AND ExternalHttpUrl != ' ' AND StatusCode >= 500 AND "__time" >= ' % s ' AND "__time" <= ' % s '
GROUP BY TIME_FLOOR ( __time , ' % s ' ) , ExternalHttpUrl ` , query . Period , constants . DruidDatasource , query . ServiceName , query . StartTime , query . EndTime , query . Period )
// zap.S().Debug(sqlQuery)
response , err := client . Query ( sqlQuery , "object" )
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// responseStr := string(response)
// zap.S().Info(responseStr)
2021-05-22 19:51:56 +05:30
res := new ( [ ] model . ServiceExternalItem )
2021-04-26 21:55:11 +05:30
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
2021-05-02 12:52:57 +05:30
sqlQuery = fmt . Sprintf ( ` SELECT TIME_FLOOR ( __time , ' % s ' ) as "time" , COUNT ( SpanId ) as "numCalls" , ExternalHttpUrl as externalHttpUrl FROM % s WHERE ServiceName = ' % s ' AND Kind = '3' AND ExternalHttpUrl != ' ' AND "__time" >= ' % s ' AND "__time" <= ' % s '
GROUP BY TIME_FLOOR ( __time , ' % s ' ) , ExternalHttpUrl ` , query . Period , constants . DruidDatasource , query . ServiceName , query . StartTime , query . EndTime , query . Period )
// zap.S().Debug(sqlQuery)
2021-04-26 21:55:11 +05:30
2021-05-02 12:52:57 +05:30
responseTotal , err := client . Query ( sqlQuery , "object" )
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
2021-04-26 21:55:11 +05:30
}
2021-05-02 12:52:57 +05:30
// responseStr := string(response)
// zap.S().Info(responseStr)
2021-05-22 19:51:56 +05:30
resTotal := new ( [ ] model . ServiceExternalItem )
2021-05-02 12:52:57 +05:30
err = json . Unmarshal ( responseTotal , resTotal )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
2021-05-05 13:04:09 +05:30
m := make ( map [ string ] int )
2021-05-02 12:52:57 +05:30
for j , _ := range * res {
timeObj , _ := time . Parse ( time . RFC3339Nano , ( * res ) [ j ] . Time )
2021-05-05 13:04:09 +05:30
m [ strconv . FormatInt ( timeObj . UnixNano ( ) , 10 ) + "-" + ( * res ) [ j ] . ExternalHttpUrl ] = ( * res ) [ j ] . NumCalls
2021-05-02 12:52:57 +05:30
}
for i , _ := range * resTotal {
timeObj , _ := time . Parse ( time . RFC3339Nano , ( * resTotal ) [ i ] . Time )
( * resTotal ) [ i ] . Timestamp = int64 ( timeObj . UnixNano ( ) )
( * resTotal ) [ i ] . Time = ""
( * resTotal ) [ i ] . CallRate = float32 ( ( * resTotal ) [ i ] . NumCalls ) / float32 ( query . StepSeconds )
2021-05-05 13:04:09 +05:30
if val , ok := m [ strconv . FormatInt ( ( * resTotal ) [ i ] . Timestamp , 10 ) + "-" + ( * resTotal ) [ i ] . ExternalHttpUrl ] ; ok {
2021-05-02 12:52:57 +05:30
( * resTotal ) [ i ] . NumErrors = val
( * resTotal ) [ i ] . ErrorRate = float32 ( ( * resTotal ) [ i ] . NumErrors ) * 100 / float32 ( ( * resTotal ) [ i ] . NumCalls )
}
( * resTotal ) [ i ] . CallRate = 0
( * resTotal ) [ i ] . NumCalls = 0
}
servicesExternalResponse := ( * resTotal ) [ 1 : ]
2021-04-26 21:55:11 +05:30
return & servicesExternalResponse , nil
}
2021-05-22 19:51:56 +05:30
func GetServiceExternal ( client * SqlClient , query * model . GetServiceOverviewParams ) ( * [ ] model . ServiceExternalItem , error ) {
2021-04-26 21:55:11 +05:30
sqlQuery := fmt . Sprintf ( ` SELECT TIME_FLOOR ( __time , ' % s ' ) as "time" , AVG ( DurationNano ) as "avgDuration" , COUNT ( SpanId ) as "numCalls" , ExternalHttpUrl as externalHttpUrl FROM % s WHERE ServiceName = ' % s ' AND Kind = '3' AND ExternalHttpUrl != ' '
AND "__time" >= ' % s ' AND "__time" <= ' % s '
GROUP BY TIME_FLOOR ( __time , ' % s ' ) , ExternalHttpUrl ` , query . Period , constants . DruidDatasource , query . ServiceName , query . StartTime , query . EndTime , query . Period )
// zap.S().Debug(sqlQuery)
response , err := client . Query ( sqlQuery , "object" )
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// responseStr := string(response)
// zap.S().Info(responseStr)
2021-05-22 19:51:56 +05:30
res := new ( [ ] model . ServiceExternalItem )
2021-04-26 21:55:11 +05:30
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
for i , _ := range * res {
timeObj , _ := time . Parse ( time . RFC3339Nano , ( * res ) [ i ] . Time )
( * res ) [ i ] . Timestamp = int64 ( timeObj . UnixNano ( ) )
( * res ) [ i ] . Time = ""
( * res ) [ i ] . CallRate = float32 ( ( * res ) [ i ] . NumCalls ) / float32 ( query . StepSeconds )
}
servicesExternalResponse := ( * res ) [ 1 : ]
return & servicesExternalResponse , nil
}
2021-05-22 19:51:56 +05:30
func GetServiceDBOverview ( client * SqlClient , query * model . GetServiceOverviewParams ) ( * [ ] model . ServiceDBOverviewItem , error ) {
2021-05-02 10:54:59 +05:30
sqlQuery := fmt . Sprintf ( ` SELECT TIME_FLOOR ( __time , ' % s ' ) as "time" , AVG ( DurationNano ) as "avgDuration" , COUNT ( SpanId ) as "numCalls" , DBSystem as "dbSystem" FROM % s WHERE ServiceName = ' % s ' AND Kind = '3' AND DBName IS NOT NULL
AND "__time" >= ' % s ' AND "__time" <= ' % s '
GROUP BY TIME_FLOOR ( __time , ' % s ' ) , DBSystem ` , query . Period , constants . DruidDatasource , query . ServiceName , query . StartTime , query . EndTime , query . Period )
// zap.S().Debug(sqlQuery)
response , err := client . Query ( sqlQuery , "object" )
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// responseStr := string(response)
// zap.S().Info(responseStr)
2021-05-22 19:51:56 +05:30
res := new ( [ ] model . ServiceDBOverviewItem )
2021-05-02 10:54:59 +05:30
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
for i , _ := range * res {
timeObj , _ := time . Parse ( time . RFC3339Nano , ( * res ) [ i ] . Time )
( * res ) [ i ] . Timestamp = int64 ( timeObj . UnixNano ( ) )
( * res ) [ i ] . Time = ""
( * res ) [ i ] . CallRate = float32 ( ( * res ) [ i ] . NumCalls ) / float32 ( query . StepSeconds )
}
servicesDBOverviewResponse := ( * res ) [ 1 : ]
return & servicesDBOverviewResponse , nil
}
2021-05-22 19:51:56 +05:30
func GetServiceOverview ( client * SqlClient , query * model . GetServiceOverviewParams ) ( * [ ] model . ServiceOverviewItem , error ) {
2021-01-03 18:15:44 +05:30
2021-05-06 17:59:54 +05:30
sqlQuery := fmt . Sprintf ( ` SELECT TIME_FLOOR ( __time , ' % s ' ) as "time" , APPROX_QUANTILE_DS ( "QuantileDuration" , 0.5 ) as p50 , APPROX_QUANTILE_DS ( "QuantileDuration" , 0.95 ) as p95 ,
2021-04-23 13:37:32 +05:30
APPROX_QUANTILE_DS ( "QuantileDuration" , 0.99 ) as p99 , COUNT ( "SpanId" ) as "numCalls" FROM "%s" WHERE "__time" >= ' % s ' and "__time" <= ' % s ' and "Kind" = '2' and "ServiceName" = ' % s ' GROUP BY TIME_FLOOR ( __time , ' % s ' ) ` , query . Period , constants . DruidDatasource , query . StartTime , query . EndTime , query . ServiceName , query . Period )
2021-01-03 18:15:44 +05:30
// zap.S().Debug(sqlQuery)
response , err := client . Query ( sqlQuery , "object" )
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// zap.S().Info(string(response))
2021-05-22 19:51:56 +05:30
res := new ( [ ] model . ServiceOverviewItem )
2021-01-03 18:15:44 +05:30
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
2021-05-01 12:37:53 +05:30
sqlQuery = fmt . Sprintf ( ` SELECT TIME_FLOOR(__time, '%s') as "time", COUNT("SpanId") as "numErrors" FROM "%s" WHERE "__time" >= '%s' and "__time" <= '%s' and "Kind"='2' and "ServiceName"='%s' and "StatusCode">=500 GROUP BY TIME_FLOOR(__time, '%s') ` , query . Period , constants . DruidDatasource , query . StartTime , query . EndTime , query . ServiceName , query . Period )
// zap.S().Debug(sqlQuery)
responseError , err := client . Query ( sqlQuery , "object" )
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// zap.S().Info(string(response))
2021-05-22 19:51:56 +05:30
resError := new ( [ ] model . ServiceErrorItem )
2021-05-01 12:37:53 +05:30
err = json . Unmarshal ( responseError , resError )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
m := make ( map [ int64 ] int )
for j , _ := range * resError {
timeObj , _ := time . Parse ( time . RFC3339Nano , ( * resError ) [ j ] . Time )
m [ int64 ( timeObj . UnixNano ( ) ) ] = ( * resError ) [ j ] . NumErrors
}
2021-01-03 18:15:44 +05:30
for i , _ := range * res {
timeObj , _ := time . Parse ( time . RFC3339Nano , ( * res ) [ i ] . Time )
( * res ) [ i ] . Timestamp = int64 ( timeObj . UnixNano ( ) )
( * res ) [ i ] . Time = ""
2021-05-01 12:37:53 +05:30
if val , ok := m [ ( * res ) [ i ] . Timestamp ] ; ok {
( * res ) [ i ] . NumErrors = val
}
2021-05-02 12:52:57 +05:30
( * res ) [ i ] . ErrorRate = float32 ( ( * res ) [ i ] . NumErrors ) * 100 / float32 ( ( * res ) [ i ] . NumCalls )
2021-01-03 18:15:44 +05:30
( * res ) [ i ] . CallRate = float32 ( ( * res ) [ i ] . NumCalls ) / float32 ( query . StepSeconds )
}
servicesOverviewResponse := ( * res ) [ 1 : ]
return & servicesOverviewResponse , nil
}
2021-05-22 19:51:56 +05:30
func GetServices ( client * SqlClient , query * model . GetServicesParams ) ( * [ ] model . ServiceItem , error ) {
2021-01-03 18:15:44 +05:30
2021-04-23 13:37:32 +05:30
sqlQuery := fmt . Sprintf ( ` SELECT APPROX_QUANTILE_DS("QuantileDuration", 0.99) as "p99", AVG("DurationNano") as "avgDuration", COUNT(SpanId) as numCalls, "ServiceName" as "serviceName" FROM %s WHERE "__time" >= '%s' and "__time" <= '%s' and "Kind"='2' GROUP BY "ServiceName" ORDER BY "p99" DESC ` , constants . DruidDatasource , query . StartTime , query . EndTime )
2021-01-03 18:15:44 +05:30
response , err := client . Query ( sqlQuery , "object" )
// zap.S().Debug(sqlQuery)
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// zap.S().Info(string(response))
2021-05-22 19:51:56 +05:30
res := new ( [ ] model . ServiceItem )
2021-01-03 18:15:44 +05:30
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
2021-05-05 00:03:57 +05:30
////////////////// Below block gets 5xx of services
2021-05-01 12:37:53 +05:30
sqlQuery = fmt . Sprintf ( ` SELECT COUNT(SpanId) as numErrors, "ServiceName" as "serviceName" FROM %s WHERE "__time" >= '%s' and "__time" <= '%s' and "Kind"='2' and "StatusCode">=500 GROUP BY "ServiceName" ` , constants . DruidDatasource , query . StartTime , query . EndTime )
responseError , err := client . Query ( sqlQuery , "object" )
// zap.S().Debug(sqlQuery)
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// zap.S().Info(string(response))
2021-05-22 19:51:56 +05:30
resError := new ( [ ] model . ServiceListErrorItem )
2021-05-01 12:37:53 +05:30
err = json . Unmarshal ( responseError , resError )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
m := make ( map [ string ] int )
for j , _ := range * resError {
m [ ( * resError ) [ j ] . ServiceName ] = ( * resError ) [ j ] . NumErrors
}
2021-05-05 00:03:57 +05:30
///////////////////////////////////////////
////////////////// Below block gets 4xx of services
2021-05-31 18:05:54 +05:30
sqlQuery = fmt . Sprintf ( ` SELECT COUNT(SpanId) as num4xx, "ServiceName" as "serviceName" FROM %s WHERE "__time" >= '%s' and "__time" <= '%s' and "Kind"='2' and "StatusCode">=400 and "StatusCode" < 500 GROUP BY "ServiceName" ` , constants . DruidDatasource , query . StartTime , query . EndTime )
2021-05-05 00:03:57 +05:30
response4xx , err := client . Query ( sqlQuery , "object" )
// zap.S().Debug(sqlQuery)
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// zap.S().Info(string(response))
2021-05-22 19:51:56 +05:30
res4xx := new ( [ ] model . ServiceListErrorItem )
2021-05-05 00:03:57 +05:30
err = json . Unmarshal ( response4xx , res4xx )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
m4xx := make ( map [ string ] int )
for j , _ := range * res4xx {
m4xx [ ( * res4xx ) [ j ] . ServiceName ] = ( * res4xx ) [ j ] . Num4xx
}
///////////////////////////////////////////
2021-01-03 18:15:44 +05:30
for i , _ := range * res {
2021-05-01 12:37:53 +05:30
if val , ok := m [ ( * res ) [ i ] . ServiceName ] ; ok {
( * res ) [ i ] . NumErrors = val
}
2021-05-05 00:03:57 +05:30
if val , ok := m4xx [ ( * res ) [ i ] . ServiceName ] ; ok {
( * res ) [ i ] . Num4XX = val
}
2021-05-01 12:37:53 +05:30
2021-05-10 17:02:58 +05:30
( * res ) [ i ] . FourXXRate = float32 ( ( * res ) [ i ] . Num4XX ) * 100 / float32 ( ( * res ) [ i ] . NumCalls )
2021-05-02 12:52:57 +05:30
( * res ) [ i ] . ErrorRate = float32 ( ( * res ) [ i ] . NumErrors ) * 100 / float32 ( ( * res ) [ i ] . NumCalls )
2021-01-03 18:15:44 +05:30
( * res ) [ i ] . CallRate = float32 ( ( * res ) [ i ] . NumCalls ) / float32 ( query . Period )
}
servicesResponse := ( * res ) [ 1 : ]
return & servicesResponse , nil
}
2021-05-05 00:03:57 +05:30
2021-05-22 19:51:56 +05:30
func GetServiceMapDependencies ( client * SqlClient , query * model . GetServicesParams ) ( * [ ] model . ServiceMapDependencyResponseItem , error ) {
2021-05-05 00:03:57 +05:30
2021-05-31 11:14:11 +05:30
sqlQuery := fmt . Sprintf ( ` SELECT SpanId, ParentSpanId, ServiceName FROM %s WHERE "__time" >= '%s' AND "__time" <= '%s' ORDER BY __time DESC ` , constants . DruidDatasource , query . StartTime , query . EndTime )
2021-05-05 00:03:57 +05:30
// zap.S().Debug(sqlQuery)
response , err := client . Query ( sqlQuery , "object" )
if err != nil {
zap . S ( ) . Error ( query , err )
return nil , fmt . Errorf ( "Something went wrong in druid query" )
}
// responseStr := string(response)
// zap.S().Info(responseStr)
2021-05-22 19:51:56 +05:30
res := new ( [ ] model . ServiceMapDependencyItem )
2021-05-05 00:03:57 +05:30
err = json . Unmarshal ( response , res )
if err != nil {
zap . S ( ) . Error ( err )
return nil , fmt . Errorf ( "Error in unmarshalling response from druid" )
}
// resCount := len(*res)
// fmt.Println(resCount)
2021-05-22 19:51:56 +05:30
serviceMap := make ( map [ string ] * model . ServiceMapDependencyResponseItem )
2021-05-05 00:03:57 +05:30
spanId2ServiceNameMap := make ( map [ string ] string )
for i , _ := range * res {
spanId2ServiceNameMap [ ( * res ) [ i ] . SpanId ] = ( * res ) [ i ] . ServiceName
}
for i , _ := range * res {
parent2childServiceName := spanId2ServiceNameMap [ ( * res ) [ i ] . ParentSpanId ] + "-" + spanId2ServiceNameMap [ ( * res ) [ i ] . SpanId ]
if _ , ok := serviceMap [ parent2childServiceName ] ; ! ok {
2021-05-22 19:51:56 +05:30
serviceMap [ parent2childServiceName ] = & model . ServiceMapDependencyResponseItem {
2021-05-05 00:03:57 +05:30
Parent : spanId2ServiceNameMap [ ( * res ) [ i ] . ParentSpanId ] ,
Child : spanId2ServiceNameMap [ ( * res ) [ i ] . SpanId ] ,
CallCount : 1 ,
}
} else {
serviceMap [ parent2childServiceName ] . CallCount ++
}
}
2021-05-22 19:51:56 +05:30
retMe := make ( [ ] model . ServiceMapDependencyResponseItem , 0 , len ( serviceMap ) )
2021-05-05 00:03:57 +05:30
for _ , dependency := range serviceMap {
2021-05-11 13:15:10 +05:30
if dependency . Parent == "" {
2021-05-05 00:03:57 +05:30
continue
}
retMe = append ( retMe , * dependency )
}
return & retMe , nil
}