From 62e77613a64c6dbf98b71d766ddc4053bfd43d05 Mon Sep 17 00:00:00 2001 From: Ankit Anand Date: Thu, 27 May 2021 12:52:34 +0530 Subject: [PATCH] sample API working in CH --- node_modules/.yarn-integrity | 10 ++ .../app/clickhouseReader/options.go | 124 ++++++++++++++++++ .../app/clickhouseReader/reader.go | 72 ++++++++-- pkg/query-service/app/http_handler.go | 50 +++---- pkg/query-service/app/interface.go | 5 +- pkg/query-service/app/server.go | 4 +- pkg/query-service/go.mod | 2 + pkg/query-service/go.sum | 12 ++ pkg/query-service/model/response.go | 19 +-- yarn.lock | 4 + 10 files changed, 249 insertions(+), 53 deletions(-) create mode 100644 node_modules/.yarn-integrity create mode 100644 pkg/query-service/app/clickhouseReader/options.go create mode 100644 yarn.lock diff --git a/node_modules/.yarn-integrity b/node_modules/.yarn-integrity new file mode 100644 index 0000000000..0f19eb7ab3 --- /dev/null +++ b/node_modules/.yarn-integrity @@ -0,0 +1,10 @@ +{ + "systemParams": "darwin-x64-83", + "modulesFolders": [], + "flags": [], + "linkedModules": [], + "topLevelPatterns": [], + "lockfileEntries": {}, + "files": [], + "artifacts": {} +} \ No newline at end of file diff --git a/pkg/query-service/app/clickhouseReader/options.go b/pkg/query-service/app/clickhouseReader/options.go new file mode 100644 index 0000000000..abf66c852d --- /dev/null +++ b/pkg/query-service/app/clickhouseReader/options.go @@ -0,0 +1,124 @@ +package clickhouseReader + +import ( + "time" + + "github.com/jmoiron/sqlx" +) + +type Encoding string + +const ( + // EncodingJSON is used for spans encoded as JSON. + EncodingJSON Encoding = "json" + // EncodingProto is used for spans encoded as Protobuf. + EncodingProto Encoding = "protobuf" +) + +const ( + defaultDatasource string = "tcp://localhost:9000" + defaultOperationsTable string = "signoz_operations" + defaultIndexTable string = "signoz_index" + defaultSpansTable string = "signoz_spans" + defaultArchiveSpansTable string = "signoz_archive_spans" + defaultWriteBatchDelay time.Duration = 5 * time.Second + defaultWriteBatchSize int = 10000 + defaultEncoding Encoding = EncodingJSON +) + +const ( + suffixEnabled = ".enabled" + suffixDatasource = ".datasource" + suffixOperationsTable = ".operations-table" + suffixIndexTable = ".index-table" + suffixSpansTable = ".spans-table" + suffixWriteBatchDelay = ".write-batch-delay" + suffixWriteBatchSize = ".write-batch-size" + suffixEncoding = ".encoding" +) + +// NamespaceConfig is Clickhouse's internal configuration data +type namespaceConfig struct { + namespace string + Enabled bool + Datasource string + OperationsTable string + IndexTable string + SpansTable string + WriteBatchDelay time.Duration + WriteBatchSize int + Encoding Encoding + Connector Connector +} + +// Connecto defines how to connect to the database +type Connector func(cfg *namespaceConfig) (*sqlx.DB, error) + +func defaultConnector(cfg *namespaceConfig) (*sqlx.DB, error) { + db, err := sqlx.Open("clickhouse", cfg.Datasource) + if err != nil { + return nil, err + } + + if err := db.Ping(); err != nil { + return nil, err + } + + return db, nil +} + +// Options store storage plugin related configs +type Options struct { + primary *namespaceConfig + + others map[string]*namespaceConfig +} + +// NewOptions creates a new Options struct. +func NewOptions(datasource string, primaryNamespace string, otherNamespaces ...string) *Options { + + if datasource == "" { + datasource = defaultDatasource + } + + options := &Options{ + primary: &namespaceConfig{ + namespace: primaryNamespace, + Enabled: true, + Datasource: datasource, + OperationsTable: defaultOperationsTable, + IndexTable: defaultIndexTable, + SpansTable: defaultSpansTable, + WriteBatchDelay: defaultWriteBatchDelay, + WriteBatchSize: defaultWriteBatchSize, + Encoding: defaultEncoding, + Connector: defaultConnector, + }, + others: make(map[string]*namespaceConfig, len(otherNamespaces)), + } + + for _, namespace := range otherNamespaces { + if namespace == archiveNamespace { + options.others[namespace] = &namespaceConfig{ + namespace: namespace, + Datasource: datasource, + OperationsTable: "", + IndexTable: "", + SpansTable: defaultArchiveSpansTable, + WriteBatchDelay: defaultWriteBatchDelay, + WriteBatchSize: defaultWriteBatchSize, + Encoding: defaultEncoding, + Connector: defaultConnector, + } + } else { + options.others[namespace] = &namespaceConfig{namespace: namespace} + } + } + + return options +} + +// GetPrimary returns the primary namespace configuration +func (opt *Options) getPrimary() *namespaceConfig { + return opt.primary +} diff --git a/pkg/query-service/app/clickhouseReader/reader.go b/pkg/query-service/app/clickhouseReader/reader.go index fa2dbf7fe2..fb9add11f8 100644 --- a/pkg/query-service/app/clickhouseReader/reader.go +++ b/pkg/query-service/app/clickhouseReader/reader.go @@ -2,13 +2,22 @@ package clickhouseReader import ( "context" - "database/sql" "errors" "fmt" + "os" "time" + + _ "github.com/ClickHouse/clickhouse-go" + "github.com/jmoiron/sqlx" + + "go.signoz.io/query-service/model" + "go.uber.org/zap" ) const ( + primaryNamespace = "clickhouse" + archiveNamespace = "clickhouse-archive" + minTimespanForProgressiveSearch = time.Hour minTimespanForProgressiveSearchMargin = time.Minute maxProgressiveSteps = 4 @@ -21,24 +30,50 @@ var ( ) // SpanWriter for reading spans from ClickHouse -type TraceReader struct { - db *sql.DB +type ClickHouseReader struct { + db *sqlx.DB operationsTable string indexTable string spansTable string } // NewTraceReader returns a TraceReader for the database -func NewTraceReader(db *sql.DB, operationsTable, indexTable, spansTable string) *TraceReader { - return &TraceReader{ +func NewReader() *ClickHouseReader { + + datasource := os.Getenv("ClickHouseUrl") + options := NewOptions(datasource, primaryNamespace, archiveNamespace) + db, err := initialize(options) + + if err != nil { + zap.S().Error(err) + } + return &ClickHouseReader{ db: db, - operationsTable: operationsTable, - indexTable: indexTable, - spansTable: spansTable, + operationsTable: options.primary.OperationsTable, + indexTable: options.primary.IndexTable, + spansTable: options.primary.SpansTable, } } -func (r *TraceReader) getStrings(ctx context.Context, sql string, args ...interface{}) ([]string, error) { +func initialize(options *Options) (*sqlx.DB, error) { + + db, err := connect(options.getPrimary()) + if err != nil { + return nil, fmt.Errorf("error connecting to primary db: %v", err) + } + + return db, nil +} + +func connect(cfg *namespaceConfig) (*sqlx.DB, error) { + if cfg.Encoding != EncodingJSON && cfg.Encoding != EncodingProto { + return nil, fmt.Errorf("unknown encoding %q, supported: %q, %q", cfg.Encoding, EncodingJSON, EncodingProto) + } + + return cfg.Connector(cfg) +} + +func (r *ClickHouseReader) getStrings(ctx context.Context, sql string, args ...interface{}) ([]string, error) { rows, err := r.db.QueryContext(ctx, sql, args...) if err != nil { return nil, err @@ -64,13 +99,22 @@ func (r *TraceReader) getStrings(ctx context.Context, sql string, args ...interf } // GetServices fetches the sorted service list that have not expired -func (r *TraceReader) GetServices(ctx context.Context) ([]string, error) { +func (r *ClickHouseReader) GetServices(ctx context.Context, queryParams *model.GetServicesParams) (*[]model.ServiceItem, error) { - if r.operationsTable == "" { - return nil, ErrNoOperationsTable + if r.indexTable == "" { + return nil, ErrNoIndexTable } - query := fmt.Sprintf("SELECT service FROM %s GROUP BY service", r.operationsTable) + var serviceItems []model.ServiceItem - return r.getStrings(ctx, query) + query := fmt.Sprintf("SELECT service as serviceName, avg(durationNano) as avgDuration FROM %s GROUP BY service", r.indexTable) + + err := r.db.Select(&serviceItems, query) + + if err != nil { + zap.S().Debug("Error in processing sql query: ", err) + return nil, err + } + + return &serviceItems, nil } diff --git a/pkg/query-service/app/http_handler.go b/pkg/query-service/app/http_handler.go index 5401edab7f..d5825509b5 100644 --- a/pkg/query-service/app/http_handler.go +++ b/pkg/query-service/app/http_handler.go @@ -56,10 +56,10 @@ type structuredError struct { func (aH *APIHandler) RegisterRoutes(router *mux.Router) { router.HandleFunc("/api/v1/user", aH.user).Methods(http.MethodPost) - router.HandleFunc("/api/v1/get_percentiles", aH.getApplicationPercentiles).Methods(http.MethodGet) + // router.HandleFunc("/api/v1/get_percentiles", aH.getApplicationPercentiles).Methods(http.MethodGet) router.HandleFunc("/api/v1/services", aH.getServices).Methods(http.MethodGet) // router.HandleFunc("/api/v1/services/list", aH.getServicesList).Methods(http.MethodGet) - router.HandleFunc("/api/v1/service/overview", aH.getServiceOverview).Methods(http.MethodGet) + // router.HandleFunc("/api/v1/service/overview", aH.getServiceOverview).Methods(http.MethodGet) // router.HandleFunc("/api/v1/service/dbOverview", aH.getServiceDBOverview).Methods(http.MethodGet) // router.HandleFunc("/api/v1/service/externalAvgDuration", aH.GetServiceExternalAvgDuration).Methods(http.MethodGet) // router.HandleFunc("/api/v1/service/externalErrors", aH.getServiceExternalErrors).Methods(http.MethodGet) @@ -241,21 +241,21 @@ func (aH *APIHandler) user(w http.ResponseWriter, r *http.Request) { // } -func (aH *APIHandler) getServiceOverview(w http.ResponseWriter, r *http.Request) { +// func (aH *APIHandler) getServiceOverview(w http.ResponseWriter, r *http.Request) { - query, err := parseGetServiceOverviewRequest(r) - if aH.handleError(w, err, http.StatusBadRequest) { - return - } +// query, err := parseGetServiceOverviewRequest(r) +// if aH.handleError(w, err, http.StatusBadRequest) { +// return +// } - result, err := (*aH.reader).GetServiceOverview(context.Background(), query) - if aH.handleError(w, err, http.StatusBadRequest) { - return - } +// result, err := (*aH.reader).GetServiceOverview(context.Background(), query) +// if aH.handleError(w, err, http.StatusBadRequest) { +// return +// } - aH.writeJSON(w, r, result) +// aH.writeJSON(w, r, result) -} +// } func (aH *APIHandler) getServices(w http.ResponseWriter, r *http.Request) { @@ -337,20 +337,20 @@ func (aH *APIHandler) getServices(w http.ResponseWriter, r *http.Request) { // aH.writeJSON(w, r, result) // } -func (aH *APIHandler) getApplicationPercentiles(w http.ResponseWriter, r *http.Request) { - // vars := mux.Vars(r) +// func (aH *APIHandler) getApplicationPercentiles(w http.ResponseWriter, r *http.Request) { +// // vars := mux.Vars(r) - query, err := parseApplicationPercentileRequest(r) - if aH.handleError(w, err, http.StatusBadRequest) { - return - } +// query, err := parseApplicationPercentileRequest(r) +// if aH.handleError(w, err, http.StatusBadRequest) { +// return +// } - result, err := (*aH.reader).GetApplicationPercentiles(context.Background(), query) - if aH.handleError(w, err, http.StatusBadRequest) { - return - } - aH.writeJSON(w, r, result) -} +// result, err := (*aH.reader).GetApplicationPercentiles(context.Background(), query) +// if aH.handleError(w, err, http.StatusBadRequest) { +// return +// } +// aH.writeJSON(w, r, result) +// } func (aH *APIHandler) handleError(w http.ResponseWriter, err error, statusCode int) bool { if err == nil { diff --git a/pkg/query-service/app/interface.go b/pkg/query-service/app/interface.go index d268820a04..47f4c74a82 100644 --- a/pkg/query-service/app/interface.go +++ b/pkg/query-service/app/interface.go @@ -3,12 +3,11 @@ package app import ( "context" - "go.signoz.io/query-service/godruid" "go.signoz.io/query-service/model" ) type Reader interface { - GetServiceOverview(ctx context.Context, query *model.GetServiceOverviewParams) (*[]model.ServiceOverviewItem, error) + // GetServiceOverview(ctx context.Context, query *model.GetServiceOverviewParams) (*[]model.ServiceOverviewItem, error) GetServices(ctx context.Context, query *model.GetServicesParams) (*[]model.ServiceItem, error) - GetApplicationPercentiles(ctx context.Context, query *model.ApplicationPercentileParams) ([]godruid.Timeseries, error) + // GetApplicationPercentiles(ctx context.Context, query *model.ApplicationPercentileParams) ([]godruid.Timeseries, error) } diff --git a/pkg/query-service/app/server.go b/pkg/query-service/app/server.go index bb3d75ab17..cecc254caf 100644 --- a/pkg/query-service/app/server.go +++ b/pkg/query-service/app/server.go @@ -13,6 +13,7 @@ import ( "github.com/posthog/posthog-go" "github.com/rs/cors" "github.com/soheilhy/cmux" + "go.signoz.io/query-service/app/clickhouseReader" "go.signoz.io/query-service/app/druidReader" "go.signoz.io/query-service/healthcheck" "go.signoz.io/query-service/utils" @@ -98,8 +99,7 @@ func createHTTPServer() (*http.Server, error) { if storage == "druid" { reader = druidReader.NewReader() } else if storage == "clickhouse" { - // clickHouseClientUrl := os.Getenv("clickHouseClientUrl") - // reader = clickHouseReader.NewTraceReader() + reader = clickhouseReader.NewReader() } else { return nil, fmt.Errorf("Storage type: %s is not supported in query service", storage) } diff --git a/pkg/query-service/go.mod b/pkg/query-service/go.mod index 152baafac1..1f6e1c9859 100644 --- a/pkg/query-service/go.mod +++ b/pkg/query-service/go.mod @@ -3,11 +3,13 @@ module go.signoz.io/query-service go 1.14 require ( + github.com/ClickHouse/clickhouse-go v1.4.5 github.com/gogo/protobuf v1.2.1 github.com/google/uuid v1.1.1 github.com/gorilla/handlers v1.5.1 github.com/gorilla/mux v1.8.0 github.com/jaegertracing/jaeger v1.21.0 + github.com/jmoiron/sqlx v1.3.4 github.com/opentracing/opentracing-go v1.1.0 github.com/ory/viper v1.7.5 github.com/posthog/posthog-go v0.0.0-20200525173953-e46dc8e6b89b diff --git a/pkg/query-service/go.sum b/pkg/query-service/go.sum index 4cce05fccc..e75469dc1e 100644 --- a/pkg/query-service/go.sum +++ b/pkg/query-service/go.sum @@ -2,6 +2,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/AndreasBriese/bbloom v0.0.0-20190825152654-46b345b51c96/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/ClickHouse/clickhouse-go v1.4.5 h1:FfhyEnv6/BaWldyjgT2k4gDDmeNwJ9C4NbY/MXxJlXk= +github.com/ClickHouse/clickhouse-go v1.4.5/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/DataDog/zstd v1.4.4/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= github.com/HdrHistogram/hdrhistogram-go v0.9.0/go.mod h1:nxrse8/Tzg2tg3DZcZjm6qEclQKK70g0KxO61gFFZD4= @@ -40,6 +42,7 @@ github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+Ce github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4= github.com/bsm/sarama-cluster v2.1.13+incompatible/go.mod h1:r7ao+4tTNXvWm+VRpRJchr2kQhqxgmAp2iEX5W96gMM= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= @@ -50,6 +53,7 @@ github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghf github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= @@ -166,6 +170,7 @@ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2K github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4= github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= github.com/gobuffalo/depgen v0.0.0-20190329151759-d478694a28d3/go.mod h1:3STtPUQYuzV0gBVOY3vy6CfMm/ljR4pABfrTeHNLHUY= @@ -277,8 +282,12 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/jaegertracing/jaeger v1.21.0 h1:Fgre3vTI5E/cmkXKBXK7ksnzul5b/3gXjA3mQzt0+58= github.com/jaegertracing/jaeger v1.21.0/go.mod h1:PCTGGFohQBPQMR4j333V5lt6If7tj8aWJ+pQNgvZ+wU= +github.com/jaegertracing/jaeger v1.22.0 h1:kFBhBn9XSB8V68DjD3t6qb/IUAJLLtyJ/27caGQOu7E= github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= +github.com/jmoiron/sqlx v1.2.0/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks= +github.com/jmoiron/sqlx v1.3.4 h1:wv+0IJZfL5z0uZoUjlpKgHkgaFSYD+r9CfrXjEXsO7w= +github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -304,6 +313,7 @@ github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= @@ -329,6 +339,8 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= diff --git a/pkg/query-service/model/response.go b/pkg/query-service/model/response.go index ba87757346..4acb528d7b 100644 --- a/pkg/query-service/model/response.go +++ b/pkg/query-service/model/response.go @@ -1,16 +1,17 @@ package model type ServiceItem struct { - ServiceName string `json:"serviceName"` - Percentile99 float32 `json:"p99"` - AvgDuration float32 `json:"avgDuration"` - NumCalls int `json:"numCalls"` - CallRate float32 `json:"callRate"` - NumErrors int `json:"numErrors"` - ErrorRate float32 `json:"errorRate"` - Num4XX int `json:"num4XX"` - FourXXRate float32 `json:"fourXXRate"` + ServiceName string `json:"serviceName" db:"serviceName"` + Percentile99 float32 `json:"p99" db:"p99"` + AvgDuration float32 `json:"avgDuration" db:"avgDuration"` + NumCalls int `json:"numCalls" db:"numCalls"` + CallRate float32 `json:"callRate" db:"callRate"` + NumErrors int `json:"numErrors" db:"numErrors"` + ErrorRate float32 `json:"errorRate" db:"errorRate"` + Num4XX int `json:"num4XX" db:"num4XX"` + FourXXRate float32 `json:"fourXXRate" db:"fourXXRate"` } + type ServiceListErrorItem struct { ServiceName string `json:"serviceName"` NumErrors int `json:"numErrors"` diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000000..fb57ccd13a --- /dev/null +++ b/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + +