feat: make SigNoz rpc aware (#1366)

* feat: make SigNoz rpc aware
* chore: update the code/method logic
This commit is contained in:
Srikanth Chekuri 2022-07-14 10:24:03 +05:30 committed by GitHub
parent 8d03569a0a
commit c3d665e119
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 267 additions and 147 deletions

View File

@ -14,7 +14,7 @@ function External({ getWidget }: ExternalProps): JSX.Element {
const { resourceAttributePromQLQuery } = useSelector<AppState, MetricReducer>( const { resourceAttributePromQLQuery } = useSelector<AppState, MetricReducer>(
(state) => state.metrics, (state) => state.metrics,
); );
const legend = '{{http_url}}'; const legend = '{{address}}';
return ( return (
<> <>
@ -28,7 +28,7 @@ function External({ getWidget }: ExternalProps): JSX.Element {
fullViewOptions={false} fullViewOptions={false}
widget={getWidget([ widget={getWidget([
{ {
query: `max((sum(rate(signoz_external_call_latency_count{service_name="${servicename}", status_code="STATUS_CODE_ERROR"${resourceAttributePromQLQuery}}[5m]) OR rate(signoz_external_call_latency_count{service_name="${servicename}", http_status_code=~"5.."${resourceAttributePromQLQuery}}[5m]) OR vector(0)) by (http_url))*100/sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (http_url)) < 1000 OR vector(0)`, query: `max((sum(rate(signoz_external_call_latency_count{service_name="${servicename}", status_code="STATUS_CODE_ERROR"${resourceAttributePromQLQuery}}[5m]) OR vector(0)) by (address))*100/sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (address)) < 1000 OR vector(0)`,
legend: 'External Call Error Percentage', legend: 'External Call Error Percentage',
}, },
])} ])}
@ -68,7 +68,7 @@ function External({ getWidget }: ExternalProps): JSX.Element {
fullViewOptions={false} fullViewOptions={false}
widget={getWidget([ widget={getWidget([
{ {
query: `sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (http_url)`, query: `sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (address)`,
legend, legend,
}, },
])} ])}
@ -87,7 +87,7 @@ function External({ getWidget }: ExternalProps): JSX.Element {
fullViewOptions={false} fullViewOptions={false}
widget={getWidget([ widget={getWidget([
{ {
query: `(sum(rate(signoz_external_call_latency_sum{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (http_url))/(sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (http_url))`, query: `(sum(rate(signoz_external_call_latency_sum{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (address))/(sum(rate(signoz_external_call_latency_count{service_name="${servicename}"${resourceAttributePromQLQuery}}[5m])) by (address))`,
legend, legend,
}, },
])} ])}

View File

@ -9,7 +9,9 @@ export const AllTraceFilterEnum: TraceFilterEnum[] = [
'serviceName', 'serviceName',
'operation', 'operation',
'component', 'component',
'httpCode', 'rpcMethod',
'responseStatusCode',
// 'httpCode',
'httpHost', 'httpHost',
'httpMethod', 'httpMethod',
'httpRoute', 'httpRoute',

View File

@ -38,6 +38,14 @@ export const groupBy: Dropdown[] = [
displayValue: 'HTTP status code', displayValue: 'HTTP status code',
key: 'httpCode', key: 'httpCode',
}, },
{
displayValue: 'RPC Method',
key: 'rpcMethod',
},
{
displayValue: 'Status Code',
key: 'responseStatusCode',
},
{ {
displayValue: 'Database name', displayValue: 'Database name',
key: 'dbName', key: 'dbName',

View File

@ -64,6 +64,8 @@ const initialValue: TraceReducer = {
['httpMethod', INITIAL_FILTER_VALUE], ['httpMethod', INITIAL_FILTER_VALUE],
['httpUrl', INITIAL_FILTER_VALUE], ['httpUrl', INITIAL_FILTER_VALUE],
['operation', INITIAL_FILTER_VALUE], ['operation', INITIAL_FILTER_VALUE],
['rpcMethod', INITIAL_FILTER_VALUE],
['responseStatusCode', INITIAL_FILTER_VALUE],
['serviceName', INITIAL_FILTER_VALUE], ['serviceName', INITIAL_FILTER_VALUE],
['status', INITIAL_FILTER_VALUE], ['status', INITIAL_FILTER_VALUE],
]), ]),

View File

@ -69,7 +69,9 @@ export type TraceFilterEnum =
| 'httpUrl' | 'httpUrl'
| 'operation' | 'operation'
| 'serviceName' | 'serviceName'
| 'status'; | 'status'
| 'responseStatusCode'
| 'rpcMethod';
export const AllPanelHeading: { export const AllPanelHeading: {
key: TraceFilterEnum; key: TraceFilterEnum;
@ -107,6 +109,14 @@ export const AllPanelHeading: {
key: 'operation', key: 'operation',
displayValue: 'Operation', displayValue: 'Operation',
}, },
{
key: 'responseStatusCode',
displayValue: 'Status Code',
},
{
key: 'rpcMethod',
displayValue: 'RPC Method',
},
{ {
key: 'serviceName', key: 'serviceName',
displayValue: 'Service Name', displayValue: 'Service Name',

View File

@ -1348,6 +1348,12 @@ func (r *ClickHouseReader) GetSpanFilters(ctx context.Context, queryParams *mode
if len(queryParams.Operation) > 0 { if len(queryParams.Operation) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args) args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args)
} }
if len(queryParams.RPCMethod) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.RPCMethod, constants.RPCMethod, &query, args)
}
if len(queryParams.ResponseStatusCode) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.ResponseStatusCode, constants.ResponseStatusCode, &query, args)
}
if len(queryParams.MinDuration) != 0 { if len(queryParams.MinDuration) != 0 {
query = query + " AND durationNano >= @durationNanoMin" query = query + " AND durationNano >= @durationNanoMin"
@ -1361,16 +1367,18 @@ func (r *ClickHouseReader) GetSpanFilters(ctx context.Context, queryParams *mode
query = getStatusFilters(query, queryParams.Status, excludeMap) query = getStatusFilters(query, queryParams.Status, excludeMap)
traceFilterReponse := model.SpanFiltersResponse{ traceFilterReponse := model.SpanFiltersResponse{
Status: map[string]uint64{}, Status: map[string]uint64{},
Duration: map[string]uint64{}, Duration: map[string]uint64{},
ServiceName: map[string]uint64{}, ServiceName: map[string]uint64{},
Operation: map[string]uint64{}, Operation: map[string]uint64{},
HttpCode: map[string]uint64{}, ResponseStatusCode: map[string]uint64{},
HttpMethod: map[string]uint64{}, RPCMethod: map[string]uint64{},
HttpUrl: map[string]uint64{}, HttpCode: map[string]uint64{},
HttpRoute: map[string]uint64{}, HttpMethod: map[string]uint64{},
HttpHost: map[string]uint64{}, HttpUrl: map[string]uint64{},
Component: map[string]uint64{}, HttpRoute: map[string]uint64{},
HttpHost: map[string]uint64{},
Component: map[string]uint64{},
} }
for _, e := range queryParams.GetFilters { for _, e := range queryParams.GetFilters {
@ -1571,6 +1579,42 @@ func (r *ClickHouseReader) GetSpanFilters(ctx context.Context, queryParams *mode
if len(dBResponse2) > 0 { if len(dBResponse2) > 0 {
traceFilterReponse.Duration["maxDuration"] = dBResponse2[0].NumTotal traceFilterReponse.Duration["maxDuration"] = dBResponse2[0].NumTotal
} }
case constants.RPCMethod:
finalQuery := fmt.Sprintf("SELECT rpcMethod, count() as count FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", r.traceDB, r.indexTable)
finalQuery += query
finalQuery += " GROUP BY rpcMethod"
var dBResponse []model.DBResponseRPCMethod
err := r.db.Select(ctx, &dBResponse, finalQuery, args...)
zap.S().Info(finalQuery)
if err != nil {
zap.S().Debug("Error in processing sql query: ", err)
return nil, &model.ApiError{Typ: model.ErrorExec, Err: fmt.Errorf("error in processing sql query: %s", err)}
}
for _, service := range dBResponse {
if service.RPCMethod != "" {
traceFilterReponse.RPCMethod[service.RPCMethod] = service.Count
}
}
case constants.ResponseStatusCode:
finalQuery := fmt.Sprintf("SELECT responseStatusCode, count() as count FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", r.traceDB, r.indexTable)
finalQuery += query
finalQuery += " GROUP BY responseStatusCode"
var dBResponse []model.DBResponseStatusCodeMethod
err := r.db.Select(ctx, &dBResponse, finalQuery, args...)
zap.S().Info(finalQuery)
if err != nil {
zap.S().Debug("Error in processing sql query: ", err)
return nil, &model.ApiError{Typ: model.ErrorExec, Err: fmt.Errorf("error in processing sql query: %s", err)}
}
for _, service := range dBResponse {
if service.ResponseStatusCode != "" {
traceFilterReponse.ResponseStatusCode[service.ResponseStatusCode] = service.Count
}
}
default: default:
return nil, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("filter type: %s not supported", e)} return nil, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("filter type: %s not supported", e)}
} }
@ -1639,6 +1683,14 @@ func (r *ClickHouseReader) GetFilteredSpans(ctx context.Context, queryParams *mo
if len(queryParams.Operation) > 0 { if len(queryParams.Operation) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args) args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args)
} }
if len(queryParams.RPCMethod) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.RPCMethod, constants.RPCMethod, &query, args)
}
if len(queryParams.ResponseStatusCode) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.ResponseStatusCode, constants.ResponseStatusCode, &query, args)
}
if len(queryParams.MinDuration) != 0 { if len(queryParams.MinDuration) != 0 {
query = query + " AND durationNano >= @durationNanoMin" query = query + " AND durationNano >= @durationNanoMin"
args = append(args, clickhouse.Named("durationNanoMin", queryParams.MinDuration)) args = append(args, clickhouse.Named("durationNanoMin", queryParams.MinDuration))
@ -1698,17 +1750,17 @@ func (r *ClickHouseReader) GetFilteredSpans(ctx context.Context, queryParams *mo
var getFilterSpansResponseItems []model.GetFilterSpansResponseItem var getFilterSpansResponseItems []model.GetFilterSpansResponseItem
baseQuery := fmt.Sprintf("SELECT timestamp, spanID, traceID, serviceName, name, durationNano, httpCode, gRPCCode, gRPCMethod, httpMethod FROM %s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryTable) baseQuery := fmt.Sprintf("SELECT timestamp, spanID, traceID, serviceName, name, durationNano, httpCode, gRPCCode, gRPCMethod, httpMethod, rpcMethod, responseStatusCode FROM %s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryTable)
baseQuery += query baseQuery += query
err := r.db.Select(ctx, &getFilterSpansResponseItems, baseQuery, args...) err := r.db.Select(ctx, &getFilterSpansResponseItems, baseQuery, args...)
// Fill status and method // Fill status and method
for i, e := range getFilterSpansResponseItems { for i, e := range getFilterSpansResponseItems {
if e.HttpCode == "" { if e.GRPCode != "" {
getFilterSpansResponseItems[i].StatusCode = e.GRPCode getFilterSpansResponseItems[i].StatusCode = e.GRPCode
} else { } else {
getFilterSpansResponseItems[i].StatusCode = e.HttpCode getFilterSpansResponseItems[i].StatusCode = e.HttpCode
} }
if e.HttpMethod == "" { if e.GRPMethod != "" {
getFilterSpansResponseItems[i].Method = e.GRPMethod getFilterSpansResponseItems[i].Method = e.GRPMethod
} else { } else {
getFilterSpansResponseItems[i].Method = e.HttpMethod getFilterSpansResponseItems[i].Method = e.HttpMethod
@ -1821,6 +1873,12 @@ func (r *ClickHouseReader) GetTagFilters(ctx context.Context, queryParams *model
if len(queryParams.Operation) > 0 { if len(queryParams.Operation) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args) args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args)
} }
if len(queryParams.RPCMethod) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.RPCMethod, constants.RPCMethod, &query, args)
}
if len(queryParams.ResponseStatusCode) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.ResponseStatusCode, constants.ResponseStatusCode, &query, args)
}
if len(queryParams.MinDuration) != 0 { if len(queryParams.MinDuration) != 0 {
query = query + " AND durationNano >= @durationNanoMin" query = query + " AND durationNano >= @durationNanoMin"
args = append(args, clickhouse.Named("durationNanoMin", queryParams.MinDuration)) args = append(args, clickhouse.Named("durationNanoMin", queryParams.MinDuration))
@ -2158,6 +2216,11 @@ func (r *ClickHouseReader) GetFilteredSpansAggregates(ctx context.Context, query
query = fmt.Sprintf("SELECT toStartOfInterval(timestamp, INTERVAL %d minute) as time, dbSystem as groupBy, %s FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryParams.StepSeconds/60, aggregation_query, r.traceDB, r.indexTable) query = fmt.Sprintf("SELECT toStartOfInterval(timestamp, INTERVAL %d minute) as time, dbSystem as groupBy, %s FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryParams.StepSeconds/60, aggregation_query, r.traceDB, r.indexTable)
case constants.Component: case constants.Component:
query = fmt.Sprintf("SELECT toStartOfInterval(timestamp, INTERVAL %d minute) as time, component as groupBy, %s FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryParams.StepSeconds/60, aggregation_query, r.traceDB, r.indexTable) query = fmt.Sprintf("SELECT toStartOfInterval(timestamp, INTERVAL %d minute) as time, component as groupBy, %s FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryParams.StepSeconds/60, aggregation_query, r.traceDB, r.indexTable)
case constants.RPCMethod:
query = fmt.Sprintf("SELECT toStartOfInterval(timestamp, INTERVAL %d minute) as time, rpcMethod as groupBy, %s FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryParams.StepSeconds/60, aggregation_query, r.traceDB, r.indexTable)
case constants.ResponseStatusCode:
query = fmt.Sprintf("SELECT toStartOfInterval(timestamp, INTERVAL %d minute) as time, responseStatusCode as groupBy, %s FROM %s.%s WHERE timestamp >= @timestampL AND timestamp <= @timestampU", queryParams.StepSeconds/60, aggregation_query, r.traceDB, r.indexTable)
default: default:
return nil, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("groupBy type: %s not supported", queryParams.GroupBy)} return nil, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("groupBy type: %s not supported", queryParams.GroupBy)}
} }
@ -2189,6 +2252,12 @@ func (r *ClickHouseReader) GetFilteredSpansAggregates(ctx context.Context, query
if len(queryParams.Operation) > 0 { if len(queryParams.Operation) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args) args = buildFilterArrayQuery(ctx, excludeMap, queryParams.Operation, constants.OperationDB, &query, args)
} }
if len(queryParams.RPCMethod) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.RPCMethod, constants.RPCMethod, &query, args)
}
if len(queryParams.ResponseStatusCode) > 0 {
args = buildFilterArrayQuery(ctx, excludeMap, queryParams.ResponseStatusCode, constants.ResponseStatusCode, &query, args)
}
if len(queryParams.MinDuration) != 0 { if len(queryParams.MinDuration) != 0 {
query = query + " AND durationNano >= @durationNanoMin" query = query + " AND durationNano >= @durationNanoMin"
args = append(args, clickhouse.Named("durationNanoMin", queryParams.MinDuration)) args = append(args, clickhouse.Named("durationNanoMin", queryParams.MinDuration))
@ -2237,6 +2306,11 @@ func (r *ClickHouseReader) GetFilteredSpansAggregates(ctx context.Context, query
query = query + " GROUP BY time, dbSystem as groupBy ORDER BY time" query = query + " GROUP BY time, dbSystem as groupBy ORDER BY time"
case constants.Component: case constants.Component:
query = query + " GROUP BY time, component as groupBy ORDER BY time" query = query + " GROUP BY time, component as groupBy ORDER BY time"
case constants.RPCMethod:
query = query + " GROUP BY time, rpcMethod as groupBy ORDER BY time"
case constants.ResponseStatusCode:
query = query + " GROUP BY time, responseStatusCode as groupBy ORDER BY time"
default: default:
return nil, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("groupBy type: %s not supported", queryParams.GroupBy)} return nil, &model.ApiError{Typ: model.ErrorBadData, Err: fmt.Errorf("groupBy type: %s not supported", queryParams.GroupBy)}
} }

View File

@ -38,33 +38,35 @@ var AmChannelApiPath = GetOrDefaultEnv("ALERTMANAGER_API_CHANNEL_PATH", "v1/rout
var RELATIONAL_DATASOURCE_PATH = GetOrDefaultEnv("SIGNOZ_LOCAL_DB_PATH", "/var/lib/signoz/signoz.db") var RELATIONAL_DATASOURCE_PATH = GetOrDefaultEnv("SIGNOZ_LOCAL_DB_PATH", "/var/lib/signoz/signoz.db")
const ( const (
ServiceName = "serviceName" ServiceName = "serviceName"
HttpRoute = "httpRoute" HttpRoute = "httpRoute"
HttpCode = "httpCode" HttpCode = "httpCode"
HttpHost = "httpHost" HttpHost = "httpHost"
HttpUrl = "httpUrl" HttpUrl = "httpUrl"
HttpMethod = "httpMethod" HttpMethod = "httpMethod"
Component = "component" Component = "component"
OperationDB = "name" OperationDB = "name"
OperationRequest = "operation" OperationRequest = "operation"
Status = "status" Status = "status"
Duration = "duration" Duration = "duration"
DBName = "dbName" DBName = "dbName"
DBOperation = "dbOperation" DBOperation = "dbOperation"
DBSystem = "dbSystem" DBSystem = "dbSystem"
MsgSystem = "msgSystem" MsgSystem = "msgSystem"
MsgOperation = "msgOperation" MsgOperation = "msgOperation"
Timestamp = "timestamp" Timestamp = "timestamp"
Descending = "descending" RPCMethod = "rpcMethod"
Ascending = "ascending" ResponseStatusCode = "responseStatusCode"
ContextTimeout = 60 // seconds Descending = "descending"
StatusPending = "pending" Ascending = "ascending"
StatusFailed = "failed" ContextTimeout = 60 // seconds
StatusSuccess = "success" StatusPending = "pending"
ExceptionType = "exceptionType" StatusFailed = "failed"
ExceptionCount = "exceptionCount" StatusSuccess = "success"
LastSeen = "lastSeen" ExceptionType = "exceptionType"
FirstSeen = "firstSeen" ExceptionCount = "exceptionCount"
LastSeen = "lastSeen"
FirstSeen = "firstSeen"
) )
const ( const (
SIGNOZ_METRIC_DBNAME = "signoz_metrics" SIGNOZ_METRIC_DBNAME = "signoz_metrics"

View File

@ -181,94 +181,102 @@ type TagQuery struct {
} }
type GetFilteredSpansParams struct { type GetFilteredSpansParams struct {
ServiceName []string `json:"serviceName"` ServiceName []string `json:"serviceName"`
Operation []string `json:"operation"` Operation []string `json:"operation"`
Kind string `json:"kind"` Kind string `json:"kind"`
Status []string `json:"status"` Status []string `json:"status"`
HttpRoute []string `json:"httpRoute"` HttpRoute []string `json:"httpRoute"`
HttpCode []string `json:"httpCode"` HttpCode []string `json:"httpCode"`
HttpUrl []string `json:"httpUrl"` HttpUrl []string `json:"httpUrl"`
HttpHost []string `json:"httpHost"` HttpHost []string `json:"httpHost"`
HttpMethod []string `json:"httpMethod"` HttpMethod []string `json:"httpMethod"`
Component []string `json:"component"` Component []string `json:"component"`
StartStr string `json:"start"` RPCMethod []string `json:"rpcMethod"`
EndStr string `json:"end"` ResponseStatusCode []string `json:"responseStatusCode"`
MinDuration string `json:"minDuration"` StartStr string `json:"start"`
MaxDuration string `json:"maxDuration"` EndStr string `json:"end"`
Limit int64 `json:"limit"` MinDuration string `json:"minDuration"`
OrderParam string `json:"orderParam"` MaxDuration string `json:"maxDuration"`
Order string `json:"order"` Limit int64 `json:"limit"`
Offset int64 `json:"offset"` OrderParam string `json:"orderParam"`
Tags []TagQuery `json:"tags"` Order string `json:"order"`
Exclude []string `json:"exclude"` Offset int64 `json:"offset"`
Start *time.Time Tags []TagQuery `json:"tags"`
End *time.Time Exclude []string `json:"exclude"`
Start *time.Time
End *time.Time
} }
type GetFilteredSpanAggregatesParams struct { type GetFilteredSpanAggregatesParams struct {
ServiceName []string `json:"serviceName"` ServiceName []string `json:"serviceName"`
Operation []string `json:"operation"` Operation []string `json:"operation"`
Kind string `json:"kind"` Kind string `json:"kind"`
Status []string `json:"status"` Status []string `json:"status"`
HttpRoute []string `json:"httpRoute"` HttpRoute []string `json:"httpRoute"`
HttpCode []string `json:"httpCode"` HttpCode []string `json:"httpCode"`
HttpUrl []string `json:"httpUrl"` HttpUrl []string `json:"httpUrl"`
HttpHost []string `json:"httpHost"` HttpHost []string `json:"httpHost"`
HttpMethod []string `json:"httpMethod"` HttpMethod []string `json:"httpMethod"`
Component []string `json:"component"` Component []string `json:"component"`
MinDuration string `json:"minDuration"` RPCMethod []string `json:"rpcMethod"`
MaxDuration string `json:"maxDuration"` ResponseStatusCode []string `json:"responseStatusCode"`
Tags []TagQuery `json:"tags"` MinDuration string `json:"minDuration"`
StartStr string `json:"start"` MaxDuration string `json:"maxDuration"`
EndStr string `json:"end"` Tags []TagQuery `json:"tags"`
StepSeconds int `json:"step"` StartStr string `json:"start"`
Dimension string `json:"dimension"` EndStr string `json:"end"`
AggregationOption string `json:"aggregationOption"` StepSeconds int `json:"step"`
GroupBy string `json:"groupBy"` Dimension string `json:"dimension"`
Function string `json:"function"` AggregationOption string `json:"aggregationOption"`
Exclude []string `json:"exclude"` GroupBy string `json:"groupBy"`
Start *time.Time Function string `json:"function"`
End *time.Time Exclude []string `json:"exclude"`
Start *time.Time
End *time.Time
} }
type SpanFilterParams struct { type SpanFilterParams struct {
Status []string `json:"status"` Status []string `json:"status"`
ServiceName []string `json:"serviceName"` ServiceName []string `json:"serviceName"`
HttpRoute []string `json:"httpRoute"` HttpRoute []string `json:"httpRoute"`
HttpCode []string `json:"httpCode"` HttpCode []string `json:"httpCode"`
HttpUrl []string `json:"httpUrl"` HttpUrl []string `json:"httpUrl"`
HttpHost []string `json:"httpHost"` HttpHost []string `json:"httpHost"`
HttpMethod []string `json:"httpMethod"` HttpMethod []string `json:"httpMethod"`
Component []string `json:"component"` Component []string `json:"component"`
Operation []string `json:"operation"` Operation []string `json:"operation"`
GetFilters []string `json:"getFilters"` RPCMethod []string `json:"rpcMethod"`
Exclude []string `json:"exclude"` ResponseStatusCode []string `json:"responseStatusCode"`
MinDuration string `json:"minDuration"` GetFilters []string `json:"getFilters"`
MaxDuration string `json:"maxDuration"` Exclude []string `json:"exclude"`
StartStr string `json:"start"` MinDuration string `json:"minDuration"`
EndStr string `json:"end"` MaxDuration string `json:"maxDuration"`
Start *time.Time StartStr string `json:"start"`
End *time.Time EndStr string `json:"end"`
Start *time.Time
End *time.Time
} }
type TagFilterParams struct { type TagFilterParams struct {
Status []string `json:"status"` Status []string `json:"status"`
ServiceName []string `json:"serviceName"` ServiceName []string `json:"serviceName"`
HttpRoute []string `json:"httpRoute"` HttpRoute []string `json:"httpRoute"`
HttpCode []string `json:"httpCode"` HttpCode []string `json:"httpCode"`
HttpUrl []string `json:"httpUrl"` HttpUrl []string `json:"httpUrl"`
HttpHost []string `json:"httpHost"` HttpHost []string `json:"httpHost"`
HttpMethod []string `json:"httpMethod"` HttpMethod []string `json:"httpMethod"`
Component []string `json:"component"` Component []string `json:"component"`
Operation []string `json:"operation"` Operation []string `json:"operation"`
Exclude []string `json:"exclude"` RPCMethod []string `json:"rpcMethod"`
MinDuration string `json:"minDuration"` ResponseStatusCode []string `json:"responseStatusCode"`
MaxDuration string `json:"maxDuration"` Exclude []string `json:"exclude"`
StartStr string `json:"start"` MinDuration string `json:"minDuration"`
EndStr string `json:"end"` MaxDuration string `json:"maxDuration"`
TagKey string `json:"tagKey"` StartStr string `json:"start"`
Start *time.Time EndStr string `json:"end"`
End *time.Time TagKey string `json:"tagKey"`
Start *time.Time
End *time.Time
} }
type TTLParams struct { type TTLParams struct {

View File

@ -118,18 +118,20 @@ type SearchSpansResult struct {
} }
type GetFilterSpansResponseItem struct { type GetFilterSpansResponseItem struct {
Timestamp time.Time `ch:"timestamp" json:"timestamp"` Timestamp time.Time `ch:"timestamp" json:"timestamp"`
SpanID string `ch:"spanID" json:"spanID"` SpanID string `ch:"spanID" json:"spanID"`
TraceID string `ch:"traceID" json:"traceID"` TraceID string `ch:"traceID" json:"traceID"`
ServiceName string `ch:"serviceName" json:"serviceName"` ServiceName string `ch:"serviceName" json:"serviceName"`
Operation string `ch:"name" json:"operation"` Operation string `ch:"name" json:"operation"`
DurationNano uint64 `ch:"durationNano" json:"durationNano"` DurationNano uint64 `ch:"durationNano" json:"durationNano"`
HttpCode string `ch:"httpCode"` HttpCode string `ch:"httpCode"`
HttpMethod string `ch:"httpMethod"` HttpMethod string `ch:"httpMethod"`
GRPCode string `ch:"gRPCCode"` GRPCode string `ch:"gRPCCode"`
GRPMethod string `ch:"gRPCMethod"` GRPMethod string `ch:"gRPCMethod"`
StatusCode string `json:"statusCode"` StatusCode string `json:"statusCode"`
Method string `json:"method"` Method string `json:"method"`
ResponseStatusCode string `ch:"responseStatusCode"`
RPCMethod string `ch:"rpcMethod"`
} }
type GetFilterSpansResponse struct { type GetFilterSpansResponse struct {
@ -303,6 +305,16 @@ type DBResponseHttpMethod struct {
Count uint64 `ch:"count"` Count uint64 `ch:"count"`
} }
type DBResponseStatusCodeMethod struct {
ResponseStatusCode string `ch:"responseStatusCode"`
Count uint64 `ch:"count"`
}
type DBResponseRPCMethod struct {
RPCMethod string `ch:"rpcMethod"`
Count uint64 `ch:"count"`
}
type DBResponseHttpHost struct { type DBResponseHttpHost struct {
HttpHost string `ch:"httpHost"` HttpHost string `ch:"httpHost"`
Count uint64 `ch:"count"` Count uint64 `ch:"count"`
@ -323,16 +335,18 @@ type DBResponseTotal struct {
} }
type SpanFiltersResponse struct { type SpanFiltersResponse struct {
ServiceName map[string]uint64 `json:"serviceName"` ServiceName map[string]uint64 `json:"serviceName"`
Status map[string]uint64 `json:"status"` Status map[string]uint64 `json:"status"`
Duration map[string]uint64 `json:"duration"` Duration map[string]uint64 `json:"duration"`
Operation map[string]uint64 `json:"operation"` Operation map[string]uint64 `json:"operation"`
HttpCode map[string]uint64 `json:"httpCode"` HttpCode map[string]uint64 `json:"httpCode"`
HttpUrl map[string]uint64 `json:"httpUrl"` ResponseStatusCode map[string]uint64 `json:"responseStatusCode"`
HttpMethod map[string]uint64 `json:"httpMethod"` RPCMethod map[string]uint64 `json:"rpcMethod"`
HttpRoute map[string]uint64 `json:"httpRoute"` HttpUrl map[string]uint64 `json:"httpUrl"`
HttpHost map[string]uint64 `json:"httpHost"` HttpMethod map[string]uint64 `json:"httpMethod"`
Component map[string]uint64 `json:"component"` HttpRoute map[string]uint64 `json:"httpRoute"`
HttpHost map[string]uint64 `json:"httpHost"`
Component map[string]uint64 `json:"component"`
} }
type Error struct { type Error struct {
ExceptionType string `json:"exceptionType" ch:"exceptionType"` ExceptionType string `json:"exceptionType" ch:"exceptionType"`