@graphoria/server 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/src/analyzeQuery/depthLimit.d.ts +1 -13
- package/dist/src/analyzeQuery/depthLimit.d.ts.map +1 -1
- package/dist/src/authentication/capabilities.d.ts +1 -1
- package/dist/src/authentication/capabilities.d.ts.map +1 -1
- package/dist/src/authentication/tokenRepository.d.ts.map +1 -1
- package/dist/src/config/types/db.d.ts +25 -0
- package/dist/src/config/types/db.d.ts.map +1 -1
- package/dist/src/configuration/getSchemas/index.d.ts +40 -0
- package/dist/src/configuration/getSchemas/index.d.ts.map +1 -1
- package/dist/src/configuration/getSchemas/mergeEntities/index.d.ts +20 -0
- package/dist/src/configuration/getSchemas/mergeEntities/index.d.ts.map +1 -1
- package/dist/src/configuration/gql/handleGraphQLRequestFactory.d.ts.map +1 -1
- package/dist/src/configuration/index.d.ts +30 -0
- package/dist/src/configuration/index.d.ts.map +1 -1
- package/dist/src/console/api.d.ts.map +1 -1
- package/dist/src/cron/index.d.ts.map +1 -1
- package/dist/src/databases/common.d.ts +20 -6
- package/dist/src/databases/common.d.ts.map +1 -1
- package/dist/src/databases/core/executor.d.ts +4 -6
- package/dist/src/databases/core/executor.d.ts.map +1 -1
- package/dist/src/databases/core/function-mapping.d.ts +1 -2
- package/dist/src/databases/core/function-mapping.d.ts.map +1 -1
- package/dist/src/databases/core/query-builder.d.ts +5 -0
- package/dist/src/databases/core/query-builder.d.ts.map +1 -1
- package/dist/src/databases/engines/mssql/getStructure.d.ts +5 -0
- package/dist/src/databases/engines/mssql/getStructure.d.ts.map +1 -1
- package/dist/src/databases/engines/mssql/query/index.d.ts +2 -2
- package/dist/src/databases/engines/mssql/query/index.d.ts.map +1 -1
- package/dist/src/databases/engines/mysql/getStructure.d.ts +5 -0
- package/dist/src/databases/engines/mysql/getStructure.d.ts.map +1 -1
- package/dist/src/databases/engines/mysql/query/index.d.ts +2 -2
- package/dist/src/databases/engines/mysql/query/index.d.ts.map +1 -1
- package/dist/src/databases/engines/postgresql/getStructure.d.ts +5 -0
- package/dist/src/databases/engines/postgresql/getStructure.d.ts.map +1 -1
- package/dist/src/databases/engines/postgresql/query/index.d.ts +2 -2
- package/dist/src/databases/engines/postgresql/query/index.d.ts.map +1 -1
- package/dist/src/databases/high-level-operations.d.ts +5 -0
- package/dist/src/databases/high-level-operations.d.ts.map +1 -1
- package/dist/src/databases/metadata/structure.d.ts +5 -0
- package/dist/src/databases/metadata/structure.d.ts.map +1 -1
- package/dist/src/databases/transformers/data-transformers.d.ts +30 -0
- package/dist/src/databases/transformers/data-transformers.d.ts.map +1 -1
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/logging/slowQuery.d.ts +29 -0
- package/dist/src/logging/slowQuery.d.ts.map +1 -0
- package/dist/src/logging/slowQuery.test.d.ts +2 -0
- package/dist/src/logging/slowQuery.test.d.ts.map +1 -0
- package/dist/src/observability/health.d.ts +23 -0
- package/dist/src/observability/health.d.ts.map +1 -0
- package/dist/src/observability/health.test.d.ts +2 -0
- package/dist/src/observability/health.test.d.ts.map +1 -0
- package/dist/src/observability/httpMetrics.d.ts +7 -0
- package/dist/src/observability/httpMetrics.d.ts.map +1 -0
- package/dist/src/observability/httpMetrics.test.d.ts +2 -0
- package/dist/src/observability/httpMetrics.test.d.ts.map +1 -0
- package/dist/src/observability/httpTracing.d.ts +11 -0
- package/dist/src/observability/httpTracing.d.ts.map +1 -0
- package/dist/src/observability/httpTracing.test.d.ts +2 -0
- package/dist/src/observability/httpTracing.test.d.ts.map +1 -0
- package/dist/src/observability/metrics.d.ts +81 -0
- package/dist/src/observability/metrics.d.ts.map +1 -0
- package/dist/src/observability/metrics.perf.test.d.ts +2 -0
- package/dist/src/observability/metrics.perf.test.d.ts.map +1 -0
- package/dist/src/observability/metrics.test.d.ts +2 -0
- package/dist/src/observability/metrics.test.d.ts.map +1 -0
- package/dist/src/observability/metricsRoute.d.ts +19 -0
- package/dist/src/observability/metricsRoute.d.ts.map +1 -0
- package/dist/src/observability/metricsRoute.test.d.ts +2 -0
- package/dist/src/observability/metricsRoute.test.d.ts.map +1 -0
- package/dist/src/observability/tracing.d.ts +92 -0
- package/dist/src/observability/tracing.d.ts.map +1 -0
- package/dist/src/observability/tracing.perf.test.d.ts +2 -0
- package/dist/src/observability/tracing.perf.test.d.ts.map +1 -0
- package/dist/src/observability/tracing.test.d.ts +2 -0
- package/dist/src/observability/tracing.test.d.ts.map +1 -0
- package/dist/src/queues/kafka.d.ts +6 -0
- package/dist/src/queues/kafka.d.ts.map +1 -1
- package/dist/src/queues/kafka.test.d.ts +2 -0
- package/dist/src/queues/kafka.test.d.ts.map +1 -0
- package/dist/src/queues/rabbitmq.d.ts.map +1 -1
- package/dist/src/remoteREST/proxy.d.ts.map +1 -1
- package/dist/src/remoteSchemas/proxy.d.ts.map +1 -1
- package/dist/src/singletons/cache/redisClient.d.ts +2 -2
- package/dist/src/singletons/cache/redisClient.d.ts.map +1 -1
- package/dist/src/singletons/databases.d.ts +1 -0
- package/dist/src/singletons/databases.d.ts.map +1 -1
- package/dist/src/singletons/env.d.ts +29 -0
- package/dist/src/singletons/env.d.ts.map +1 -1
- package/dist/src/singletons/queues.d.ts +1 -0
- package/dist/src/singletons/queues.d.ts.map +1 -1
- package/dist/src/subscriptions/strategies/database.d.ts.map +1 -1
- package/dist/src/subscriptions/utils/polling.d.ts +1 -0
- package/dist/src/subscriptions/utils/polling.d.ts.map +1 -1
- package/dist/src/subscriptions/utils/polling.test.d.ts +2 -0
- package/dist/src/subscriptions/utils/polling.test.d.ts.map +1 -0
- package/dist/src/types/env.d.ts +89 -0
- package/dist/src/types/env.d.ts.map +1 -1
- package/dist/src/types/zod/configuration.d.ts +25 -0
- package/dist/src/types/zod/configuration.d.ts.map +1 -1
- package/dist/src/types/zod/db.d.ts +85 -0
- package/dist/src/types/zod/db.d.ts.map +1 -1
- package/dist/src/utils/rateLimit.d.ts.map +1 -1
- package/dist/src/utils/redis.d.ts +17 -0
- package/dist/src/utils/redis.d.ts.map +1 -0
- package/dist/src/utils/redis.test.d.ts +2 -0
- package/dist/src/utils/redis.test.d.ts.map +1 -0
- package/dist/src/utils/responses.d.ts +3 -0
- package/dist/src/utils/responses.d.ts.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -1
- package/playgrounds/console/index.html +8 -8
- package/playgrounds/graphiql/index.html +114 -114
- package/playgrounds/scalar/index.html +1 -1
- package/src/analyzeQuery/depthLimit.ts +15 -5
- package/src/authentication/capabilities.ts +3 -1
- package/src/authentication/tokenRepository.ts +2 -3
- package/src/config/types/db.ts +16 -2
- package/src/configuration/gql/handleGraphQLRequestFactory.ts +233 -152
- package/src/console/api.ts +1 -6
- package/src/cron/index.ts +59 -36
- package/src/databases/common.ts +109 -10
- package/src/databases/core/executor.ts +96 -18
- package/src/databases/core/function-mapping.ts +1 -1
- package/src/databases/engines/mssql/query/index.ts +4 -1
- package/src/databases/engines/mysql/query/index.ts +5 -2
- package/src/databases/engines/postgresql/query/index.ts +5 -2
- package/src/databases/high-level-operations.ts +44 -2
- package/src/index.ts +147 -62
- package/src/logging/slowQuery.ts +59 -0
- package/src/observability/health.ts +67 -0
- package/src/observability/httpMetrics.ts +37 -0
- package/src/observability/httpTracing.ts +48 -0
- package/src/observability/metrics.ts +243 -0
- package/src/observability/metricsRoute.ts +33 -0
- package/src/observability/tracing.ts +421 -0
- package/src/queues/kafka.ts +45 -2
- package/src/queues/rabbitmq.ts +37 -1
- package/src/remoteREST/proxy.ts +17 -0
- package/src/remoteSchemas/proxy.ts +17 -0
- package/src/singletons/cache/redisClient.ts +4 -5
- package/src/singletons/databases.ts +5 -0
- package/src/singletons/queues.ts +9 -3
- package/src/subscriptions/strategies/database.ts +2 -0
- package/src/subscriptions/utils/polling.ts +80 -21
- package/src/types/env.ts +27 -0
- package/src/utils/rateLimit.ts +6 -1
- package/src/utils/redis.ts +71 -0
- package/src/utils/responses.ts +6 -0
|
@@ -25,6 +25,11 @@ export declare const getDatabaseStructure: (db: Database) => Promise<{
|
|
|
25
25
|
target?: string | undefined;
|
|
26
26
|
operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
|
|
27
27
|
value?: string | number | boolean | undefined;
|
|
28
|
+
ancestor?: {
|
|
29
|
+
schema: string;
|
|
30
|
+
name: string;
|
|
31
|
+
column: string;
|
|
32
|
+
} | undefined;
|
|
28
33
|
}[] | undefined;
|
|
29
34
|
dashedName: string;
|
|
30
35
|
}[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getStructure.d.ts","sourceRoot":"","sources":["../../../../../src/databases/engines/mysql/getStructure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAoB7D,eAAO,MAAM,oBAAoB,OAAc,QAAQ
|
|
1
|
+
{"version":3,"file":"getStructure.d.ts","sourceRoot":"","sources":["../../../../../src/databases/engines/mysql/getStructure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAoB7D,eAAO,MAAM,oBAAoB,OAAc,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+HtD,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { OperationAnalysis, SelectionAnalysis, VariableDefinition } from "../../../../analyzeQuery/types";
|
|
2
2
|
import type { MergedEntities } from "../../../../configuration/getSchemas/mergeEntities";
|
|
3
|
-
import type { PageLimits } from "../../../common";
|
|
3
|
+
import type { PageLimits, QueryPathFrame } from "../../../common";
|
|
4
4
|
export declare const generateSQL: (entities: MergedEntities, operation: OperationAnalysis, variables?: Record<string, unknown>, forHashMethod?: boolean, pageLimits?: PageLimits | null, timeoutMs?: number) => string;
|
|
5
5
|
export declare const buildSQLForField: (entities: MergedEntities, variablesDefinition: VariableDefinition[], variables: Record<string, unknown> | undefined, field: SelectionAnalysis, parentTableName: string | null, parentTableAlias: string | null, level: number, aliasMap: {
|
|
6
6
|
[alias: string]: string;
|
|
7
|
-
}, pageLimits: PageLimits | null) => string;
|
|
7
|
+
}, pageLimits: PageLimits | null, ancestors?: readonly QueryPathFrame[]) => string;
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/databases/engines/mysql/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAqJ/
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/databases/engines/mysql/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,KAAK,EAAe,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAqJ/E,eAAO,MAAM,WAAW,aACZ,cAAc,aACb,iBAAiB,cACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,kBACnB,OAAO,eACV,UAAU,GAAG,IAAI,cACjB,MAAM,KACjB,MAqFF,CAAC;AAEF,eAAO,MAAM,gBAAgB,aACjB,cAAc,uBACH,kBAAkB,EAAE,aAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,qBAC3B,iBAAiB,mBACP,MAAM,GAAG,IAAI,oBACZ,MAAM,GAAG,IAAI,SACxB,MAAM,YACH;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,cACzB,UAAU,GAAG,IAAI,cAClB,SAAS,cAAc,EAAE,KACnC,MAiHF,CAAC"}
|
|
@@ -25,6 +25,11 @@ export declare const getDatabaseStructure: (db: Database) => Promise<{
|
|
|
25
25
|
target?: string | undefined;
|
|
26
26
|
operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
|
|
27
27
|
value?: string | number | boolean | undefined;
|
|
28
|
+
ancestor?: {
|
|
29
|
+
schema: string;
|
|
30
|
+
name: string;
|
|
31
|
+
column: string;
|
|
32
|
+
} | undefined;
|
|
28
33
|
}[] | undefined;
|
|
29
34
|
dashedName: string;
|
|
30
35
|
}[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getStructure.d.ts","sourceRoot":"","sources":["../../../../../src/databases/engines/postgresql/getStructure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAK7D,eAAO,MAAM,oBAAoB,OAAc,QAAQ
|
|
1
|
+
{"version":3,"file":"getStructure.d.ts","sourceRoot":"","sources":["../../../../../src/databases/engines/postgresql/getStructure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAK7D,eAAO,MAAM,oBAAoB,OAAc,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgJtD,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { OperationAnalysis, SelectionAnalysis, VariableDefinition } from "../../../../analyzeQuery/types";
|
|
2
2
|
import type { MergedEntities } from "../../../../configuration/getSchemas/mergeEntities";
|
|
3
|
-
import type { PageLimits } from "../../../common";
|
|
3
|
+
import type { PageLimits, QueryPathFrame } from "../../../common";
|
|
4
4
|
export declare const generateSQL: (entities: MergedEntities, operation: OperationAnalysis, variables?: Record<string, unknown>, forHashMethod?: boolean, pageLimits?: PageLimits | null) => string;
|
|
5
5
|
export declare const buildSQLForField: (entities: MergedEntities, variablesDefinition: VariableDefinition[], variables: Record<string, unknown> | undefined, field: SelectionAnalysis, parentTableName: string | null, parentTableAlias: string | null, level: number, aliasMap: {
|
|
6
6
|
[alias: string]: string;
|
|
7
|
-
}, pageLimits: PageLimits | null) => string;
|
|
7
|
+
}, pageLimits: PageLimits | null, ancestors?: readonly QueryPathFrame[]) => string;
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/databases/engines/postgresql/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,KAAK,EAAe,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAiJ/
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/databases/engines/postgresql/query/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,KAAK,EAAe,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAiJ/E,eAAO,MAAM,WAAW,aACZ,cAAc,aACb,iBAAiB,cACjB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,kBACnB,OAAO,eACV,UAAU,GAAG,IAAI,KAC5B,MA2EF,CAAC;AAEF,eAAO,MAAM,gBAAgB,aACjB,cAAc,uBACH,kBAAkB,EAAE,aAC9B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,qBAC3B,iBAAiB,mBACP,MAAM,GAAG,IAAI,oBACZ,MAAM,GAAG,IAAI,SACxB,MAAM,YACH;IAAE,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAA;CAAE,cACzB,UAAU,GAAG,IAAI,cAClB,SAAS,cAAc,EAAE,KACnC,MA0GF,CAAC"}
|
|
@@ -47,6 +47,11 @@ export declare const getDatabasesStructure: (databases: Database[], auth?: Auth,
|
|
|
47
47
|
target?: string | undefined;
|
|
48
48
|
operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
|
|
49
49
|
value?: string | number | boolean | undefined;
|
|
50
|
+
ancestor?: {
|
|
51
|
+
schema: string;
|
|
52
|
+
name: string;
|
|
53
|
+
column: string;
|
|
54
|
+
} | undefined;
|
|
50
55
|
}[] | undefined;
|
|
51
56
|
}[];
|
|
52
57
|
description?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"high-level-operations.d.ts","sourceRoot":"","sources":["../../../src/databases/high-level-operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAe,aAAa,EAAU,MAAM,aAAa,CAAC;AAEzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAI5D;;GAEG;AAEH,eAAO,MAAM,qBAAqB,cACrB,QAAQ,EAAE,SACd,IAAI
|
|
1
|
+
{"version":3,"file":"high-level-operations.d.ts","sourceRoot":"","sources":["../../../src/databases/high-level-operations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,WAAW,EAGZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAe,aAAa,EAAU,MAAM,aAAa,CAAC;AAEzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAI5D;;GAEG;AAEH,eAAO,MAAM,qBAAqB,cACrB,QAAQ,EAAE,SACd,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqLZ,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;IACtC,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,oBAAoB,EAAE,CAAC;IACtC,UAAU,EAAE,kBAAkB,EAAE,CAAC;CAClC,CAAC;AAmCF,eAAO,MAAM,kBAAkB,WACrB,aAAa,EAAE,oBACL,iBAAiB,EAAE,UAC7B,YAAY,EAAE,cACV,UAAU,uBACF,WAAW,kBAChB,oBAAoB,EAAE,eACzB,kBAAkB,EAAE,mCA4F/B,CAAC"}
|
|
@@ -28,6 +28,11 @@ export declare const getDatabaseStructure: (db: Database) => Promise<{
|
|
|
28
28
|
target?: string | undefined;
|
|
29
29
|
operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
|
|
30
30
|
value?: string | number | boolean | undefined;
|
|
31
|
+
ancestor?: {
|
|
32
|
+
schema: string;
|
|
33
|
+
name: string;
|
|
34
|
+
column: string;
|
|
35
|
+
} | undefined;
|
|
31
36
|
}[] | undefined;
|
|
32
37
|
dashedName: string;
|
|
33
38
|
}[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../../src/databases/metadata/structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAI1D;;GAEG;AAEH,eAAO,MAAM,oBAAoB,OAAc,QAAQ
|
|
1
|
+
{"version":3,"file":"structure.d.ts","sourceRoot":"","sources":["../../../../src/databases/metadata/structure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAI1D;;GAEG;AAEH,eAAO,MAAM,oBAAoB,OAAc,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EACH,CAAC;AAErD,eAAO,MAAM,cAAc,OAAc,QAAQ;;;;IAA2C,CAAC"}
|
|
@@ -15,6 +15,11 @@ export declare const buildRelationshipResolver: (table: Table, foreignKey: Relat
|
|
|
15
15
|
target?: string | undefined;
|
|
16
16
|
operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
|
|
17
17
|
value?: string | number | boolean | undefined;
|
|
18
|
+
ancestor?: {
|
|
19
|
+
schema: string;
|
|
20
|
+
name: string;
|
|
21
|
+
column: string;
|
|
22
|
+
} | undefined;
|
|
18
23
|
}[] | undefined;
|
|
19
24
|
internalName: string;
|
|
20
25
|
fromInternalName: string;
|
|
@@ -61,6 +66,11 @@ export declare const buildTableResolver: (tables: Tables, table: Table, db: Data
|
|
|
61
66
|
target?: string | undefined;
|
|
62
67
|
operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
|
|
63
68
|
value?: string | number | boolean | undefined;
|
|
69
|
+
ancestor?: {
|
|
70
|
+
schema: string;
|
|
71
|
+
name: string;
|
|
72
|
+
column: string;
|
|
73
|
+
} | undefined;
|
|
64
74
|
}[] | undefined;
|
|
65
75
|
}[];
|
|
66
76
|
description?: string | undefined;
|
|
@@ -107,6 +117,11 @@ export declare const buildTableResolver: (tables: Tables, table: Table, db: Data
|
|
|
107
117
|
target?: string | undefined;
|
|
108
118
|
operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
|
|
109
119
|
value?: string | number | boolean | undefined;
|
|
120
|
+
ancestor?: {
|
|
121
|
+
schema: string;
|
|
122
|
+
name: string;
|
|
123
|
+
column: string;
|
|
124
|
+
} | undefined;
|
|
110
125
|
}[] | undefined;
|
|
111
126
|
internalName: string;
|
|
112
127
|
fromInternalName: string;
|
|
@@ -126,6 +141,11 @@ export declare const buildTableResolver: (tables: Tables, table: Table, db: Data
|
|
|
126
141
|
target?: string | undefined;
|
|
127
142
|
operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
|
|
128
143
|
value?: string | number | boolean | undefined;
|
|
144
|
+
ancestor?: {
|
|
145
|
+
schema: string;
|
|
146
|
+
name: string;
|
|
147
|
+
column: string;
|
|
148
|
+
} | undefined;
|
|
129
149
|
}[] | undefined;
|
|
130
150
|
internalName: string;
|
|
131
151
|
fromInternalName: string;
|
|
@@ -157,6 +177,11 @@ export declare const buildTableResolver: (tables: Tables, table: Table, db: Data
|
|
|
157
177
|
target?: string | undefined;
|
|
158
178
|
operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
|
|
159
179
|
value?: string | number | boolean | undefined;
|
|
180
|
+
ancestor?: {
|
|
181
|
+
schema: string;
|
|
182
|
+
name: string;
|
|
183
|
+
column: string;
|
|
184
|
+
} | undefined;
|
|
160
185
|
}[] | undefined;
|
|
161
186
|
dashedName: string;
|
|
162
187
|
}[];
|
|
@@ -204,6 +229,11 @@ export declare const buildProcedureResolver: (sp: StoredProcedure, db: Database)
|
|
|
204
229
|
target?: string | undefined;
|
|
205
230
|
operator: "eq" | "gt" | "gte" | "is_not_null" | "is_null" | "like" | "lt" | "lte" | "neq";
|
|
206
231
|
value?: string | number | boolean | undefined;
|
|
232
|
+
ancestor?: {
|
|
233
|
+
schema: string;
|
|
234
|
+
name: string;
|
|
235
|
+
column: string;
|
|
236
|
+
} | undefined;
|
|
207
237
|
}[] | undefined;
|
|
208
238
|
}[];
|
|
209
239
|
description?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-transformers.d.ts","sourceRoot":"","sources":["../../../../src/databases/transformers/data-transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAwB,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK3F;;GAEG;AAEH,eAAO,MAAM,yBAAyB,UAC7B,KAAK,cACA,aAAa,CAAC,MAAM,CAAC,MAC7B,QAAQ
|
|
1
|
+
{"version":3,"file":"data-transformers.d.ts","sourceRoot":"","sources":["../../../../src/databases/transformers/data-transformers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,KAAK,EAAwB,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAK3F;;GAEG;AAEH,eAAO,MAAM,yBAAyB,UAC7B,KAAK,cACA,aAAa,CAAC,MAAM,CAAC,MAC7B,QAAQ;;;;;;;;;;;;;;;;;;;;;;;CAiEb,CAAC;AAEF,eAAO,MAAM,kBAAkB,WAAY,MAAM,SAAS,KAAK,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgC5E,CAAC;AAEF,eAAO,MAAM,sBAAsB,OAAQ,eAAe,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgBvE,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -85,6 +85,8 @@ export declare function createHandlers(options?: Partial<Env>): Promise<{
|
|
|
85
85
|
rest: string;
|
|
86
86
|
openapi: string;
|
|
87
87
|
console: string;
|
|
88
|
+
health: string;
|
|
89
|
+
metrics: string;
|
|
88
90
|
};
|
|
89
91
|
logger: typeof logger;
|
|
90
92
|
execute: (query: string, variables?: Record<string, unknown>, opts?: import("./configuration/gql/buildExecute").ExecuteOptions) => Promise<{
|
|
@@ -126,6 +128,8 @@ export declare function createBunServer(options?: Partial<Env>): Promise<{
|
|
|
126
128
|
rest: string;
|
|
127
129
|
openapi: string;
|
|
128
130
|
console: string;
|
|
131
|
+
health: string;
|
|
132
|
+
metrics: string;
|
|
129
133
|
};
|
|
130
134
|
logger: typeof logger;
|
|
131
135
|
execute: (query: string, variables?: Record<string, unknown>, opts?: import("./configuration/gql/buildExecute").ExecuteOptions) => Promise<{
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAGtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAcvC,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAGtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAcvC,OAAO,EAEL,mBAAmB,EAGpB,MAAM,wBAAwB,CAAC;AAehC,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAUrD,OAAO,EAAE,gBAAgB,EAAE,CAAC;AAE5B,KAAK,YAAY,GACb,QAAQ,GACR,CAAC,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,CAAC,CAAC;AAEjG,KAAK,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;AAqG7E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,mBAAmB,aAAoB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;EAc/D,CAAC;AAmXF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,cAAc,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;GAoB1D;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,eAAe,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;GAW3D"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Logger } from "pino";
|
|
2
|
+
/** The GraphQL operation a statement was generated for. Names only, never values. */
|
|
3
|
+
export type QuerySource = {
|
|
4
|
+
operation: {
|
|
5
|
+
type: "query" | "mutation" | "subscription";
|
|
6
|
+
name: string | null;
|
|
7
|
+
fields: string[];
|
|
8
|
+
};
|
|
9
|
+
role?: string | undefined;
|
|
10
|
+
};
|
|
11
|
+
export type SlowQueryRecord = {
|
|
12
|
+
durationMs: number;
|
|
13
|
+
dbType: string;
|
|
14
|
+
dbName: string;
|
|
15
|
+
sql?: string;
|
|
16
|
+
procedure?: string;
|
|
17
|
+
outcome: "success" | "error";
|
|
18
|
+
} & Partial<QuerySource>;
|
|
19
|
+
export type SlowQueryLog = {
|
|
20
|
+
emit(record: SlowQueryRecord & {
|
|
21
|
+
thresholdMs: number;
|
|
22
|
+
}): void;
|
|
23
|
+
};
|
|
24
|
+
export declare const setSlowQueryMs: (ms: number) => void;
|
|
25
|
+
export declare const createSlowQueryLog: (base: Logger) => SlowQueryLog;
|
|
26
|
+
/** Test seam: pass `null` to restore the default log. */
|
|
27
|
+
export declare const setSlowQueryLog: (log: SlowQueryLog | null) => void;
|
|
28
|
+
export declare const reportQueryDuration: (record: SlowQueryRecord) => void;
|
|
29
|
+
//# sourceMappingURL=slowQuery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slowQuery.d.ts","sourceRoot":"","sources":["../../../src/logging/slowQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,qFAAqF;AACrF,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE;QACT,IAAI,EAAE,OAAO,GAAG,UAAU,GAAG,cAAc,CAAC;QAC5C,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QACpB,MAAM,EAAE,MAAM,EAAE,CAAC;KAClB,CAAC;IACF,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,SAAS,GAAG,OAAO,CAAC;CAC9B,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AAEzB,MAAM,MAAM,YAAY,GAAG;IACzB,IAAI,CAAC,MAAM,EAAE,eAAe,GAAG;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CAC/D,CAAC;AAQF,eAAO,MAAM,cAAc,OAAQ,MAAM,KAAG,IAE3C,CAAC;AAEF,eAAO,MAAM,kBAAkB,SAAU,MAAM,KAAG,YAEhD,CAAC;AAKH,yDAAyD;AACzD,eAAO,MAAM,eAAe,QAAS,YAAY,GAAG,IAAI,KAAG,IAE1D,CAAC;AAQF,eAAO,MAAM,mBAAmB,WAAY,eAAe,KAAG,IAG7D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slowQuery.test.d.ts","sourceRoot":"","sources":["../../../src/logging/slowQuery.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { S200, S503 } from "../utils/responses";
|
|
2
|
+
export type HealthCheck = {
|
|
3
|
+
kind: string;
|
|
4
|
+
name?: string;
|
|
5
|
+
probe: () => Promise<boolean> | boolean;
|
|
6
|
+
};
|
|
7
|
+
export type HealthRoutesOptions = {
|
|
8
|
+
basePath: string;
|
|
9
|
+
/** Read on every readiness request, so a check can follow state that changes after boot. */
|
|
10
|
+
checks: () => HealthCheck[];
|
|
11
|
+
timeoutMs: number;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Unauthenticated probes for an orchestrator. Liveness touches nothing, so a
|
|
15
|
+
* dependency outage never gets the process restarted; readiness pings every
|
|
16
|
+
* dependency and answers 503 while one is down. The body names each check and
|
|
17
|
+
* whether it passed — the reason stays in the log, because a driver error can
|
|
18
|
+
* carry a host and port.
|
|
19
|
+
*/
|
|
20
|
+
export declare const createHealthRoutes: ({ basePath, checks, timeoutMs }: HealthRoutesOptions) => {
|
|
21
|
+
[x: string]: (() => S200) | (() => Promise<S200 | S503>);
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/observability/health.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,MAAM,EAAE,MAAM,WAAW,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAgBF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,oCAAqC,mBAAmB;;CA6BtF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.test.d.ts","sourceRoot":"","sources":["../../../src/observability/health.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a route handler so the request is counted and timed. The route label is
|
|
3
|
+
* the name of the mounted route, never the URL: a path carries identifiers, and
|
|
4
|
+
* one series per identifier is a cardinality leak.
|
|
5
|
+
*/
|
|
6
|
+
export declare const withHttpMetrics: <Req extends Request, Args extends unknown[]>(route: string, handler: (req: Req, ...args: Args) => Response | undefined | Promise<Response | undefined>) => (req: Req, ...args: Args) => Promise<Response | undefined>;
|
|
7
|
+
//# sourceMappingURL=httpMetrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpMetrics.d.ts","sourceRoot":"","sources":["../../../src/observability/httpMetrics.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,eAAO,MAAM,eAAe,GACzB,GAAG,SAAS,OAAO,EAAE,IAAI,SAAS,OAAO,EAAE,SACnC,MAAM,WACJ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,WAEhF,GAAG,WAAW,IAAI,KAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAwB5D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpMetrics.test.d.ts","sourceRoot":"","sources":["../../../src/observability/httpMetrics.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wraps a route handler so the request roots a trace. The span is named for the
|
|
3
|
+
* mounted route, never the URL: a path carries identifiers and a query string
|
|
4
|
+
* carries caller data, and a span name is exported verbatim.
|
|
5
|
+
*
|
|
6
|
+
* An inbound `traceparent` is continued, so a gateway's span and this one join
|
|
7
|
+
* up. `parent: null` is deliberate — a request is a root, never a child of
|
|
8
|
+
* whatever context the server happened to be in.
|
|
9
|
+
*/
|
|
10
|
+
export declare const withHttpTracing: <Req extends Request, Args extends unknown[]>(route: string, handler: (req: Req, ...args: Args) => Response | undefined | Promise<Response | undefined>) => (req: Req, ...args: Args) => Promise<Response | undefined>;
|
|
11
|
+
//# sourceMappingURL=httpTracing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpTracing.d.ts","sourceRoot":"","sources":["../../../src/observability/httpTracing.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,eAAO,MAAM,eAAe,GACzB,GAAG,SAAS,OAAO,EAAE,IAAI,SAAS,OAAO,EAAE,SACnC,MAAM,WACJ,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,IAAI,KAAK,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC,WAEhF,GAAG,WAAW,IAAI,KAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CA+B5D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpTracing.test.d.ts","sourceRoot":"","sources":["../../../src/observability/httpTracing.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
declare const METRICS: {
|
|
2
|
+
readonly graphoria_graphql_operations_total: {
|
|
3
|
+
readonly type: "counter";
|
|
4
|
+
readonly help: "GraphQL operations executed, by outcome.";
|
|
5
|
+
readonly labelNames: readonly ["operation", "outcome", "role", "type"];
|
|
6
|
+
};
|
|
7
|
+
readonly graphoria_graphql_operation_duration_seconds: {
|
|
8
|
+
readonly type: "histogram";
|
|
9
|
+
readonly help: "Time spent handling a GraphQL operation, in seconds.";
|
|
10
|
+
readonly labelNames: readonly ["operation", "role", "type"];
|
|
11
|
+
};
|
|
12
|
+
readonly graphoria_http_requests_total: {
|
|
13
|
+
readonly type: "counter";
|
|
14
|
+
readonly help: "HTTP requests answered by the GraphQL and REST routes, by status.";
|
|
15
|
+
readonly labelNames: readonly ["method", "route", "status"];
|
|
16
|
+
};
|
|
17
|
+
readonly graphoria_http_request_duration_seconds: {
|
|
18
|
+
readonly type: "histogram";
|
|
19
|
+
readonly help: "Time spent answering an HTTP request, in seconds.";
|
|
20
|
+
readonly labelNames: readonly ["method", "route"];
|
|
21
|
+
};
|
|
22
|
+
readonly graphoria_cron_runs_total: {
|
|
23
|
+
readonly type: "counter";
|
|
24
|
+
readonly help: "Cron ticks that ran to completion or threw, by job.";
|
|
25
|
+
readonly labelNames: readonly ["job", "outcome"];
|
|
26
|
+
};
|
|
27
|
+
readonly graphoria_cron_run_duration_seconds: {
|
|
28
|
+
readonly type: "histogram";
|
|
29
|
+
readonly help: "Time spent in a cron tick, in seconds.";
|
|
30
|
+
readonly labelNames: readonly ["job"];
|
|
31
|
+
};
|
|
32
|
+
readonly graphoria_queue_messages_published_total: {
|
|
33
|
+
readonly type: "counter";
|
|
34
|
+
readonly help: "Messages handed to a broker, by publisher and outcome.";
|
|
35
|
+
readonly labelNames: readonly ["broker", "outcome", "publisher"];
|
|
36
|
+
};
|
|
37
|
+
readonly graphoria_queue_messages_consumed_total: {
|
|
38
|
+
readonly type: "counter";
|
|
39
|
+
readonly help: "Messages taken from a broker, by consumer and outcome.";
|
|
40
|
+
readonly labelNames: readonly ["broker", "consumer", "outcome", "queue"];
|
|
41
|
+
};
|
|
42
|
+
readonly graphoria_rate_limit_rejections_total: {
|
|
43
|
+
readonly type: "counter";
|
|
44
|
+
readonly help: "Requests refused by the rate limiter, by the role the ceiling was read from.";
|
|
45
|
+
readonly labelNames: readonly ["role"];
|
|
46
|
+
};
|
|
47
|
+
readonly graphoria_graphql_rejections_total: {
|
|
48
|
+
readonly type: "counter";
|
|
49
|
+
readonly help: "GraphQL operations rejected before execution.";
|
|
50
|
+
readonly labelNames: readonly ["reason"];
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
export type MetricName = keyof typeof METRICS;
|
|
54
|
+
export type Labels = Record<string, string>;
|
|
55
|
+
export type Registry = {
|
|
56
|
+
inc(metric: MetricName, labels: Labels, value?: number): void;
|
|
57
|
+
observe(metric: MetricName, labels: Labels, seconds: number): void;
|
|
58
|
+
render(): string;
|
|
59
|
+
};
|
|
60
|
+
export type RegistryOptions = {
|
|
61
|
+
/** Distinct values the caller-supplied `operation` label may take, per metric. */
|
|
62
|
+
maxOperationLabels?: number;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* A metric store with no dependencies. The `operation` label is the only one a
|
|
66
|
+
* caller controls, so it is the only one capped: past the cap every new name
|
|
67
|
+
* collapses into `other` rather than minting a series the scrape has to carry
|
|
68
|
+
* forever.
|
|
69
|
+
*/
|
|
70
|
+
export declare const createRegistry: ({ maxOperationLabels, }?: RegistryOptions) => Registry;
|
|
71
|
+
export declare const configureMetrics: (settings: {
|
|
72
|
+
enabled: boolean;
|
|
73
|
+
} & RegistryOptions) => void;
|
|
74
|
+
/** Test seam: pass `null` to drop the process registry and its recorded series. */
|
|
75
|
+
export declare const setMetricsRegistry: (registry: Registry | null) => void;
|
|
76
|
+
export declare const isMetricsEnabled: () => boolean;
|
|
77
|
+
export declare const incMetric: (metric: MetricName, labels: Labels, value?: number) => void;
|
|
78
|
+
export declare const observeMetric: (metric: MetricName, labels: Labels, seconds: number) => void;
|
|
79
|
+
export declare const renderMetrics: () => string;
|
|
80
|
+
export {};
|
|
81
|
+
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/observability/metrics.ts"],"names":[],"mappings":"AAOA,QAAA,MAAM,OAAO;;iBAET,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,0CAA0C;iBAChD,UAAU;;;iBAGV,IAAI,EAAE,WAAW;iBACjB,IAAI,EAAE,sDAAsD;iBAC5D,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,mEAAmE;iBACzE,UAAU;;;iBAGV,IAAI,EAAE,WAAW;iBACjB,IAAI,EAAE,mDAAmD;iBACzD,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,qDAAqD;iBAC3D,UAAU;;;iBAGV,IAAI,EAAE,WAAW;iBACjB,IAAI,EAAE,wCAAwC;iBAC9C,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,wDAAwD;iBAC9D,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,wDAAwD;iBAC9D,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,8EAA8E;iBACpF,UAAU;;;iBAGV,IAAI,EAAE,SAAS;iBACf,IAAI,EAAE,+CAA+C;iBACrD,UAAU;;CAEuC,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG,MAAM,OAAO,OAAO,CAAC;AAE9C,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5C,MAAM,MAAM,QAAQ,GAAG;IACrB,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9D,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACnE,MAAM,IAAI,MAAM,CAAC;CAClB,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,kFAAkF;IAClF,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B,CAAC;AAeF;;;;;GAKG;AACH,eAAO,MAAM,cAAc,6BAExB,eAAe,KAAQ,QAqGzB,CAAC;AAeF,eAAO,MAAM,gBAAgB,aAAc;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,eAAe,KAAG,IAInF,CAAC;AAEF,mFAAmF;AACnF,eAAO,MAAM,kBAAkB,aAAc,QAAQ,GAAG,IAAI,KAAG,IAG9D,CAAC;AAQF,eAAO,MAAM,gBAAgB,QAAO,OAAkB,CAAC;AAEvD,eAAO,MAAM,SAAS,WAAY,UAAU,UAAU,MAAM,qBAAc,IAGzE,CAAC;AAEF,eAAO,MAAM,aAAa,WAAY,UAAU,UAAU,MAAM,WAAW,MAAM,KAAG,IAGnF,CAAC;AAEF,eAAO,MAAM,aAAa,QAAO,MAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.perf.test.d.ts","sourceRoot":"","sources":["../../../src/observability/metrics.perf.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.test.d.ts","sourceRoot":"","sources":["../../../src/observability/metrics.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CapabilityGrant } from "../authentication/capabilities";
|
|
2
|
+
export type MetricsRouteOptions = {
|
|
3
|
+
path: string;
|
|
4
|
+
/** The header a scoped credential rides in — the admin-secret header. */
|
|
5
|
+
secretHeader: string;
|
|
6
|
+
authorize: (candidate: string | null) => CapabilityGrant | null;
|
|
7
|
+
render: () => string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* A scrape is gated because the exposition names operations, roles and
|
|
11
|
+
* databases. It is deliberately not rate limited: a scrape interval is fixed
|
|
12
|
+
* and counting it against a caller ceiling would drop samples.
|
|
13
|
+
*/
|
|
14
|
+
export declare const createMetricsRoute: ({ path, secretHeader, authorize, render, }: MetricsRouteOptions) => {
|
|
15
|
+
[x: string]: {
|
|
16
|
+
GET: (req: Request) => Response;
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=metricsRoute.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metricsRoute.d.ts","sourceRoot":"","sources":["../../../src/observability/metricsRoute.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAItE,MAAM,MAAM,mBAAmB,GAAG;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,KAAK,eAAe,GAAG,IAAI,CAAC;IAChE,MAAM,EAAE,MAAM,MAAM,CAAC;CACtB,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,+CAK5B,mBAAmB;;mBAEP,OAAO;;CAMpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metricsRoute.test.d.ts","sourceRoot":"","sources":["../../../src/observability/metricsRoute.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { Logger } from "pino";
|
|
2
|
+
export type SpanKind = "internal" | "server" | "client" | "producer" | "consumer";
|
|
3
|
+
export type SpanStatus = "unset" | "ok" | "error";
|
|
4
|
+
export type AttributeValue = string | number | boolean;
|
|
5
|
+
export type Attributes = Record<string, AttributeValue | undefined>;
|
|
6
|
+
/** What rides in the async context: three scalars, never the span itself. */
|
|
7
|
+
export type SpanContext = {
|
|
8
|
+
traceId: string;
|
|
9
|
+
spanId: string;
|
|
10
|
+
sampled: boolean;
|
|
11
|
+
};
|
|
12
|
+
export type SpanOptions = {
|
|
13
|
+
kind?: SpanKind;
|
|
14
|
+
attributes?: Attributes;
|
|
15
|
+
/** Overrides the active context — the inbound `traceparent`, or a deliberate root. */
|
|
16
|
+
parent?: SpanContext | null;
|
|
17
|
+
};
|
|
18
|
+
export type Span = {
|
|
19
|
+
readonly context: SpanContext;
|
|
20
|
+
setAttribute(key: string, value: AttributeValue | undefined): void;
|
|
21
|
+
setStatus(status: SpanStatus, message?: string): void;
|
|
22
|
+
recordError(error: unknown): void;
|
|
23
|
+
end(): void;
|
|
24
|
+
};
|
|
25
|
+
export type FinishedSpan = {
|
|
26
|
+
traceId: string;
|
|
27
|
+
spanId: string;
|
|
28
|
+
parentSpanId?: string;
|
|
29
|
+
name: string;
|
|
30
|
+
kind: SpanKind;
|
|
31
|
+
startTimeUnixNano: string;
|
|
32
|
+
endTimeUnixNano: string;
|
|
33
|
+
attributes: Attributes;
|
|
34
|
+
status: SpanStatus;
|
|
35
|
+
statusMessage?: string;
|
|
36
|
+
};
|
|
37
|
+
export type Tracer = {
|
|
38
|
+
startSpan(name: string, options?: SpanOptions): Span;
|
|
39
|
+
/** Runs `fn` with `span` active, ends it, and marks it errored if `fn` throws. */
|
|
40
|
+
withSpan<T>(name: string, options: SpanOptions, fn: (span: Span) => T | Promise<T>): Promise<T>;
|
|
41
|
+
active(): SpanContext | undefined;
|
|
42
|
+
flush(): Promise<void>;
|
|
43
|
+
};
|
|
44
|
+
export type TracerOptions = {
|
|
45
|
+
endpoint: string;
|
|
46
|
+
/** `k=v,k2=v2`, sent on every export — an API key for a hosted collector. */
|
|
47
|
+
headers?: string;
|
|
48
|
+
serviceName: string;
|
|
49
|
+
serviceVersion: string;
|
|
50
|
+
sampleRatio?: number;
|
|
51
|
+
maxBatch?: number;
|
|
52
|
+
maxQueue?: number;
|
|
53
|
+
/** `0` starts no timer, which is how a test drives the exporter by hand. */
|
|
54
|
+
exportIntervalMs?: number;
|
|
55
|
+
/** Test seam: where an export failure and a queue overflow are reported. */
|
|
56
|
+
log?: Pick<Logger, "warn">;
|
|
57
|
+
/** Test seam: the transport. Production POSTs with `fetch`. */
|
|
58
|
+
send?: (url: string, init: {
|
|
59
|
+
method: string;
|
|
60
|
+
headers: Record<string, string>;
|
|
61
|
+
body: string;
|
|
62
|
+
}) => Promise<void>;
|
|
63
|
+
};
|
|
64
|
+
export declare const parseTraceparent: (header: string | null | undefined) => SpanContext | undefined;
|
|
65
|
+
export declare const formatTraceparent: (context: SpanContext) => string;
|
|
66
|
+
/**
|
|
67
|
+
* A tracer with no dependencies: W3C ids, OTLP/HTTP JSON, and a bounded export
|
|
68
|
+
* queue. Nothing here reads process state — everything it needs is closed over,
|
|
69
|
+
* so it is unit-testable without booting a server.
|
|
70
|
+
*/
|
|
71
|
+
export declare const createTracer: ({ endpoint, headers, serviceName, serviceVersion, sampleRatio, maxBatch, maxQueue, exportIntervalMs, send, log, }: TracerOptions) => Tracer;
|
|
72
|
+
export declare const configureTracing: (next: {
|
|
73
|
+
enabled: boolean;
|
|
74
|
+
endpoint: string;
|
|
75
|
+
headers: string;
|
|
76
|
+
serviceName: string;
|
|
77
|
+
sampleRatio: number;
|
|
78
|
+
}) => void;
|
|
79
|
+
/** Test seam: pass `null` to drop the process tracer and its queued spans. */
|
|
80
|
+
export declare const setTracer: (tracer: Tracer | null) => void;
|
|
81
|
+
export declare const isTracingEnabled: () => boolean;
|
|
82
|
+
export declare const startSpan: (name: string, options?: SpanOptions) => Span | undefined;
|
|
83
|
+
export declare const withSpan: <T>(name: string, options: SpanOptions, fn: (span: Span | undefined) => T | Promise<T>) => Promise<T>;
|
|
84
|
+
/**
|
|
85
|
+
* Runs `fn` with `span` active, leaving its lifetime to the caller. A span that
|
|
86
|
+
* is never ended is never exported, which is how a websocket upgrade — a
|
|
87
|
+
* request that is never answered — produces no span at all.
|
|
88
|
+
*/
|
|
89
|
+
export declare const withActiveSpan: <T>(span: Span | undefined, fn: () => T) => T;
|
|
90
|
+
export declare const activeSpanContext: () => SpanContext | undefined;
|
|
91
|
+
export declare const flushSpans: () => Promise<void>;
|
|
92
|
+
//# sourceMappingURL=tracing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../../src/observability/tracing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.perf.test.d.ts","sourceRoot":"","sources":["../../../src/observability/tracing.perf.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracing.test.d.ts","sourceRoot":"","sources":["../../../src/observability/tracing.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Kafka } from "kafkajs";
|
|
1
2
|
import type { Consumer } from "kafkajs";
|
|
2
3
|
import type { KafkaConfig } from "../types/zod/queue";
|
|
3
4
|
export declare const startConsumer: (connectionName: string, name: string, topic: string, consumer: Consumer, _consumerGroup: string) => Promise<void>;
|
|
@@ -13,6 +14,11 @@ export type KafkaConnectionManager = {
|
|
|
13
14
|
cleanup: () => Promise<void>;
|
|
14
15
|
onPublishersChanged: (callback: () => void) => void;
|
|
15
16
|
};
|
|
17
|
+
export type KafkaDependencies = {
|
|
18
|
+
/** Test seam: the manager builds its client through this. */
|
|
19
|
+
createKafka?: (config: ConstructorParameters<typeof Kafka>[0]) => Kafka;
|
|
20
|
+
};
|
|
21
|
+
export declare const createKafkaConnectionManager: (queueConfig: KafkaConfig, { createKafka }?: KafkaDependencies) => KafkaConnectionManager;
|
|
16
22
|
export declare const startKafkaConnections: (queues: KafkaConfig[]) => Promise<{
|
|
17
23
|
managers: KafkaConnectionManager[];
|
|
18
24
|
publisherMap: () => Record<string, KafkaPublisher>;
|