@envelop/opentelemetry 3.5.1-alpha-20220824165935-4720f031 → 3.6.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 +0 -10
- package/cjs/index.js +0 -4
- package/esm/index.js +0 -4
- package/package.json +4 -4
- package/cjs/traced-schema.js +0 -68
- package/esm/traced-schema.js +0 -64
- package/typings/traced-schema.d.cts +0 -2
- package/typings/traced-schema.d.ts +0 -2
package/README.md
CHANGED
|
@@ -15,15 +15,10 @@ yarn add @envelop/opentelemetry
|
|
|
15
15
|
By default, this plugin prints the collected telemetry to the console:
|
|
16
16
|
|
|
17
17
|
```ts
|
|
18
|
-
import { parse, validate, execute, subscribe } from 'graphql'
|
|
19
18
|
import { envelop } from '@envelop/core'
|
|
20
19
|
import { useOpenTelemetry } from '@envelop/opentelemetry'
|
|
21
20
|
|
|
22
21
|
const getEnveloped = envelop({
|
|
23
|
-
parse,
|
|
24
|
-
validate,
|
|
25
|
-
execute,
|
|
26
|
-
subscribe,
|
|
27
22
|
plugins: [
|
|
28
23
|
// ... other plugins ...
|
|
29
24
|
useOpenTelemetry({
|
|
@@ -38,7 +33,6 @@ const getEnveloped = envelop({
|
|
|
38
33
|
If you wish to use custom tracer/exporter, create it and pass it. This example integrates Jaeger tracer:
|
|
39
34
|
|
|
40
35
|
```ts
|
|
41
|
-
import { parse, validate, execute, subscribe } from 'graphql'
|
|
42
36
|
import { envelop } from '@envelop/core'
|
|
43
37
|
import { useOpenTelemetry } from '@envelop/opentelemetry'
|
|
44
38
|
import { JaegerExporter } from '@opentelemetry/exporter-jaeger'
|
|
@@ -53,10 +47,6 @@ provider.addSpanProcessor(new SimpleSpanProcessor(exporter))
|
|
|
53
47
|
provider.register()
|
|
54
48
|
|
|
55
49
|
const getEnveloped = envelop({
|
|
56
|
-
parse,
|
|
57
|
-
validate,
|
|
58
|
-
execute,
|
|
59
|
-
subscribe,
|
|
60
50
|
plugins: [
|
|
61
51
|
// ... other plugins ...
|
|
62
52
|
useOpenTelemetry(
|
package/cjs/index.js
CHANGED
|
@@ -7,7 +7,6 @@ const api_1 = require("@opentelemetry/api");
|
|
|
7
7
|
const opentelemetry = tslib_1.__importStar(require("@opentelemetry/api"));
|
|
8
8
|
const tracing_1 = require("@opentelemetry/tracing");
|
|
9
9
|
const graphql_1 = require("graphql");
|
|
10
|
-
const traced_schema_js_1 = require("./traced-schema.js");
|
|
11
10
|
var AttributeName;
|
|
12
11
|
(function (AttributeName) {
|
|
13
12
|
AttributeName["EXECUTION_ERROR"] = "graphql.execute.error";
|
|
@@ -30,9 +29,6 @@ const useOpenTelemetry = (options, tracingProvider, spanKind = api_1.SpanKind.SE
|
|
|
30
29
|
}
|
|
31
30
|
const tracer = tracingProvider.getTracer(serviceName);
|
|
32
31
|
return {
|
|
33
|
-
onSchemaChange: async ({ schema }) => {
|
|
34
|
-
(0, traced_schema_js_1.prepareTracedSchema)(schema);
|
|
35
|
-
},
|
|
36
32
|
onResolverCalled: options.resolvers
|
|
37
33
|
? ({ info, context, args }) => {
|
|
38
34
|
if (context && typeof context === 'object' && context[tracingSpanSymbol]) {
|
package/esm/index.js
CHANGED
|
@@ -3,7 +3,6 @@ import { SpanKind } from '@opentelemetry/api';
|
|
|
3
3
|
import * as opentelemetry from '@opentelemetry/api';
|
|
4
4
|
import { BasicTracerProvider, ConsoleSpanExporter, SimpleSpanProcessor } from '@opentelemetry/tracing';
|
|
5
5
|
import { print } from 'graphql';
|
|
6
|
-
import { prepareTracedSchema } from './traced-schema.js';
|
|
7
6
|
export var AttributeName;
|
|
8
7
|
(function (AttributeName) {
|
|
9
8
|
AttributeName["EXECUTION_ERROR"] = "graphql.execute.error";
|
|
@@ -26,9 +25,6 @@ export const useOpenTelemetry = (options, tracingProvider, spanKind = SpanKind.S
|
|
|
26
25
|
}
|
|
27
26
|
const tracer = tracingProvider.getTracer(serviceName);
|
|
28
27
|
return {
|
|
29
|
-
onSchemaChange: async ({ schema }) => {
|
|
30
|
-
prepareTracedSchema(schema);
|
|
31
|
-
},
|
|
32
28
|
onResolverCalled: options.resolvers
|
|
33
29
|
? ({ info, context, args }) => {
|
|
34
30
|
if (context && typeof context === 'object' && context[tracingSpanSymbol]) {
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@envelop/opentelemetry",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.6.0",
|
|
4
4
|
"sideEffects": false,
|
|
5
5
|
"peerDependencies": {
|
|
6
|
-
"@envelop/
|
|
7
|
-
"@envelop/core": "2.5.1-alpha-20220824165935-4720f031",
|
|
6
|
+
"@envelop/core": "^2.6.0",
|
|
8
7
|
"graphql": "^14.0.0 || ^15.0.0 || ^16.0.0"
|
|
9
8
|
},
|
|
10
9
|
"dependencies": {
|
|
11
10
|
"@opentelemetry/api": "^1.0.0",
|
|
12
|
-
"@opentelemetry/tracing": "^0.24.0"
|
|
11
|
+
"@opentelemetry/tracing": "^0.24.0",
|
|
12
|
+
"tslib": "^2.4.0"
|
|
13
13
|
},
|
|
14
14
|
"repository": {
|
|
15
15
|
"type": "git",
|
package/cjs/traced-schema.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.prepareTracedSchema = void 0;
|
|
4
|
-
const graphql_1 = require("graphql");
|
|
5
|
-
const core_1 = require("@envelop/core");
|
|
6
|
-
const trackedSchemaSymbol = Symbol('TRACKED_SCHEMA');
|
|
7
|
-
function prepareTracedSchema(schema) {
|
|
8
|
-
if (!schema || schema[trackedSchemaSymbol]) {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
schema[trackedSchemaSymbol] = true;
|
|
12
|
-
const entries = Object.values(schema.getTypeMap());
|
|
13
|
-
for (const type of entries) {
|
|
14
|
-
if (!(0, graphql_1.isIntrospectionType)(type) && (0, graphql_1.isObjectType)(type)) {
|
|
15
|
-
const fields = Object.values(type.getFields());
|
|
16
|
-
for (const field of fields) {
|
|
17
|
-
let resolverFn = (field.resolve || graphql_1.defaultFieldResolver);
|
|
18
|
-
field.resolve = async (root, args, context, info) => {
|
|
19
|
-
if (context && context[core_1.resolversHooksSymbol]) {
|
|
20
|
-
const hooks = context[core_1.resolversHooksSymbol];
|
|
21
|
-
const afterCalls = [];
|
|
22
|
-
for (const hook of hooks) {
|
|
23
|
-
const afterFn = await hook({
|
|
24
|
-
root,
|
|
25
|
-
args,
|
|
26
|
-
context,
|
|
27
|
-
info,
|
|
28
|
-
resolverFn,
|
|
29
|
-
replaceResolverFn: newFn => {
|
|
30
|
-
resolverFn = newFn;
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
afterFn && afterCalls.push(afterFn);
|
|
34
|
-
}
|
|
35
|
-
try {
|
|
36
|
-
let result = await resolverFn(root, args, context, info);
|
|
37
|
-
for (const afterFn of afterCalls) {
|
|
38
|
-
afterFn({
|
|
39
|
-
result,
|
|
40
|
-
setResult: newResult => {
|
|
41
|
-
result = newResult;
|
|
42
|
-
},
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
return result;
|
|
46
|
-
}
|
|
47
|
-
catch (e) {
|
|
48
|
-
let resultErr = e;
|
|
49
|
-
for (const afterFn of afterCalls) {
|
|
50
|
-
afterFn({
|
|
51
|
-
result: resultErr,
|
|
52
|
-
setResult: newResult => {
|
|
53
|
-
resultErr = newResult;
|
|
54
|
-
},
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
throw resultErr;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
else {
|
|
61
|
-
return resolverFn(root, args, context, info);
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
exports.prepareTracedSchema = prepareTracedSchema;
|
package/esm/traced-schema.js
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { defaultFieldResolver, isIntrospectionType, isObjectType } from 'graphql';
|
|
2
|
-
import { resolversHooksSymbol } from '@envelop/core';
|
|
3
|
-
const trackedSchemaSymbol = Symbol('TRACKED_SCHEMA');
|
|
4
|
-
export function prepareTracedSchema(schema) {
|
|
5
|
-
if (!schema || schema[trackedSchemaSymbol]) {
|
|
6
|
-
return;
|
|
7
|
-
}
|
|
8
|
-
schema[trackedSchemaSymbol] = true;
|
|
9
|
-
const entries = Object.values(schema.getTypeMap());
|
|
10
|
-
for (const type of entries) {
|
|
11
|
-
if (!isIntrospectionType(type) && isObjectType(type)) {
|
|
12
|
-
const fields = Object.values(type.getFields());
|
|
13
|
-
for (const field of fields) {
|
|
14
|
-
let resolverFn = (field.resolve || defaultFieldResolver);
|
|
15
|
-
field.resolve = async (root, args, context, info) => {
|
|
16
|
-
if (context && context[resolversHooksSymbol]) {
|
|
17
|
-
const hooks = context[resolversHooksSymbol];
|
|
18
|
-
const afterCalls = [];
|
|
19
|
-
for (const hook of hooks) {
|
|
20
|
-
const afterFn = await hook({
|
|
21
|
-
root,
|
|
22
|
-
args,
|
|
23
|
-
context,
|
|
24
|
-
info,
|
|
25
|
-
resolverFn,
|
|
26
|
-
replaceResolverFn: newFn => {
|
|
27
|
-
resolverFn = newFn;
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
afterFn && afterCalls.push(afterFn);
|
|
31
|
-
}
|
|
32
|
-
try {
|
|
33
|
-
let result = await resolverFn(root, args, context, info);
|
|
34
|
-
for (const afterFn of afterCalls) {
|
|
35
|
-
afterFn({
|
|
36
|
-
result,
|
|
37
|
-
setResult: newResult => {
|
|
38
|
-
result = newResult;
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
return result;
|
|
43
|
-
}
|
|
44
|
-
catch (e) {
|
|
45
|
-
let resultErr = e;
|
|
46
|
-
for (const afterFn of afterCalls) {
|
|
47
|
-
afterFn({
|
|
48
|
-
result: resultErr,
|
|
49
|
-
setResult: newResult => {
|
|
50
|
-
resultErr = newResult;
|
|
51
|
-
},
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
throw resultErr;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
else {
|
|
58
|
-
return resolverFn(root, args, context, info);
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|