@twin.org/telemetry-service 0.0.3-next.1 → 0.0.3-next.3

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # TWIN Telemetry Service
2
2
 
3
- Telemetry contract implementation and REST endpoint definitions.
3
+ Telemetry service implementation with REST entry points.
4
4
 
5
5
  ## Installation
6
6
 
@@ -229,7 +229,7 @@ export function generateRestRoutesTelemetry(baseRouteName, componentName) {
229
229
  id: "telemetryListRequestExample",
230
230
  request: {
231
231
  query: {
232
- type: MetricType.Counter
232
+ type: MetricType.Counter.toString()
233
233
  }
234
234
  }
235
235
  }
@@ -1 +1 @@
1
- {"version":3,"file":"telemetryRoutes.js","sourceRoot":"","sources":["../../src/telemetryRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type {\n\tICreatedResponse,\n\tIHttpRequestContext,\n\tINoContentResponse,\n\tIRestRoute,\n\tITag\n} from \"@twin.org/api-models\";\nimport { Coerce, ComponentFactory, Guards } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tMetricType,\n\ttype ITelemetryAddMetricValueRequest,\n\ttype ITelemetryComponent,\n\ttype ITelemetryCreateMetricRequest,\n\ttype ITelemetryGetMetricRequest,\n\ttype ITelemetryGetMetricResponse,\n\ttype ITelemetryListRequest,\n\ttype ITelemetryListResponse,\n\ttype ITelemetryRemoveMetricRequest,\n\ttype ITelemetryUpdateMetricRequest,\n\ttype ITelemetryValuesListRequest,\n\ttype ITelemetryValuesListResponse\n} from \"@twin.org/telemetry-models\";\nimport { HeaderTypes, HttpStatusCode } from \"@twin.org/web\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"telemetryRoutes\";\n\n/**\n * The tag to associate with the routes.\n */\nexport const tagsTelemetry: ITag[] = [\n\t{\n\t\tname: \"Telemetry\",\n\t\tdescription: \"Endpoints which are modelled to access a telemetry contract.\"\n\t}\n];\n\n/**\n * The REST routes for telemetry.\n * @param baseRouteName Prefix to prepend to the paths.\n * @param componentName The name of the component to use in the routes stored in the ComponentFactory.\n * @returns The generated routes.\n */\nexport function generateRestRoutesTelemetry(\n\tbaseRouteName: string,\n\tcomponentName: string\n): IRestRoute[] {\n\tconst createMetricRoute: IRestRoute<ITelemetryCreateMetricRequest, ICreatedResponse> = {\n\t\toperationId: \"telemetryCreateMetric\",\n\t\tsummary: \"Create a telemetry metric\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/metric`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryCreateMetric(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryCreateMetricRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryCreateMetricRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tid: \"my-counter\",\n\t\t\t\t\t\t\tlabel: \"My Counter\",\n\t\t\t\t\t\t\tdescription: \"This is my counter\",\n\t\t\t\t\t\t\ttype: MetricType.Counter,\n\t\t\t\t\t\t\tunit: \"KG\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ICreatedResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"telemetryCreateMetricResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tstatusCode: HttpStatusCode.created,\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t[HeaderTypes.Location]: \"my-counter\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\tconst getMetricRoute: IRestRoute<ITelemetryGetMetricRequest, ITelemetryGetMetricResponse> = {\n\t\toperationId: \"telemetryGetMetric\",\n\t\tsummary: \"Get a telemetry metric and it's most recent value\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/metric/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryGetMetric(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryGetMetricRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryGetMetricRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ITelemetryGetMetricResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"telemetryGetMetricResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmetric: {\n\t\t\t\t\t\t\t\t\tid: \"my-counter\",\n\t\t\t\t\t\t\t\t\tlabel: \"My Counter\",\n\t\t\t\t\t\t\t\t\tdescription: \"This is my counter\",\n\t\t\t\t\t\t\t\t\ttype: MetricType.Counter,\n\t\t\t\t\t\t\t\t\tunit: \"KG\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\t\t\tid: \"aabbccdd11223445566\",\n\t\t\t\t\t\t\t\t\tts: 1715252922273,\n\t\t\t\t\t\t\t\t\tvalue: 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\tconst updateMetricRoute: IRestRoute<ITelemetryUpdateMetricRequest, INoContentResponse> = {\n\t\toperationId: \"telemetryUpdateMetric\",\n\t\tsummary: \"Update a telemetry metric\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"PUT\",\n\t\tpath: `${baseRouteName}/metric/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryUpdateMetric(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryUpdateMetricRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryUpdateMetricRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tlabel: \"My New Label\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<INoContentResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst addMetricValueRoute: IRestRoute<ITelemetryAddMetricValueRequest, ICreatedResponse> = {\n\t\toperationId: \"telemetryAddMetricValue\",\n\t\tsummary: \"Add a telemetry metric value\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/metric/:id/value`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryAddMetricValue(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryAddMetricValueRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryAddMetricValueRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tvalue: 10\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryAddMetricValueIncRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tvalue: \"inc\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ICreatedResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"telemetryAddMetricValueResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tstatusCode: HttpStatusCode.created,\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t[HeaderTypes.Location]: \"aabbccdd11223445566\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\tconst removeMetricRoute: IRestRoute<ITelemetryRemoveMetricRequest, INoContentResponse> = {\n\t\toperationId: \"telemetryRemoveMetric\",\n\t\tsummary: \"Remove a telemetry metric and it's values.\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"DELETE\",\n\t\tpath: `${baseRouteName}/metric/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryRemoveMetric(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryRemoveMetricRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryRemoveMetricRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<INoContentResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst listMetricsRoute: IRestRoute<ITelemetryListRequest, ITelemetryListResponse> = {\n\t\toperationId: \"telemetryListEntries\",\n\t\tsummary: \"Get a list of the telemetry metrics\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/metric`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryMetricList(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryListRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryListRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\ttype: MetricType.Counter\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ITelemetryListResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"telemetryListResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tentities: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: \"my-counter\",\n\t\t\t\t\t\t\t\t\t\tlabel: \"My Counter\",\n\t\t\t\t\t\t\t\t\t\ttype: MetricType.Counter,\n\t\t\t\t\t\t\t\t\t\tunit: \"KG\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: \"my-counter-2\",\n\t\t\t\t\t\t\t\t\t\tlabel: \"My Counter 2\",\n\t\t\t\t\t\t\t\t\t\ttype: MetricType.IncDecCounter,\n\t\t\t\t\t\t\t\t\t\tunit: \"M\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tcursor: \"1\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\tconst listMetricsValuesRoute: IRestRoute<\n\t\tITelemetryValuesListRequest,\n\t\tITelemetryValuesListResponse\n\t> = {\n\t\toperationId: \"telemetryValuesListEntries\",\n\t\tsummary: \"Get a list of the values for a telemetry metric\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/metric/:id/value`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryMetricValueList(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryValuesListRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryValuesListRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ITelemetryValuesListResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"telemetryValuesListResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmetric: {\n\t\t\t\t\t\t\t\t\tid: \"my-counter\",\n\t\t\t\t\t\t\t\t\tlabel: \"My Counter\",\n\t\t\t\t\t\t\t\t\ttype: MetricType.Counter,\n\t\t\t\t\t\t\t\t\tunit: \"KG\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tentities: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: \"aabbccdd11223445566\",\n\t\t\t\t\t\t\t\t\t\tts: 1715252922273,\n\t\t\t\t\t\t\t\t\t\tvalue: 10\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: \"aabbccdd11223445566\",\n\t\t\t\t\t\t\t\t\t\tts: 1715252922274,\n\t\t\t\t\t\t\t\t\t\tvalue: 11\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tcursor: \"1\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\treturn [\n\t\tcreateMetricRoute,\n\t\tgetMetricRoute,\n\t\tupdateMetricRoute,\n\t\taddMetricValueRoute,\n\t\tremoveMetricRoute,\n\t\tlistMetricsRoute,\n\t\tlistMetricsValuesRoute\n\t];\n}\n\n/**\n * Create a new telemetry metric.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryCreateMetric(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryCreateMetricRequest\n): Promise<ICreatedResponse> {\n\tGuards.object<ITelemetryCreateMetricRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryCreateMetricRequest[\"body\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.body),\n\t\trequest.body\n\t);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\tawait component.createMetric({\n\t\tid: request.body.id,\n\t\tlabel: request.body.label,\n\t\tdescription: request.body.description,\n\t\ttype: request.body.type,\n\t\tunit: request.body.unit\n\t});\n\treturn {\n\t\tstatusCode: HttpStatusCode.created,\n\t\theaders: {\n\t\t\t[HeaderTypes.Location]: request.body.id\n\t\t}\n\t};\n}\n\n/**\n * Gets a telemetry metric.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryGetMetric(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryGetMetricRequest\n): Promise<ITelemetryGetMetricResponse> {\n\tGuards.object<ITelemetryGetMetricRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryGetMetricRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\tconst result = await component.getMetric(request.pathParams.id);\n\treturn { body: result };\n}\n\n/**\n * Updates a telemetry metric.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryUpdateMetric(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryUpdateMetricRequest\n): Promise<INoContentResponse> {\n\tGuards.object<ITelemetryUpdateMetricRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryUpdateMetricRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\tGuards.object<ITelemetryUpdateMetricRequest[\"body\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.body),\n\t\trequest.body\n\t);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\tawait component.updateMetric({\n\t\tid: request.pathParams.id,\n\t\tlabel: request.body.label,\n\t\tdescription: request.body.description,\n\t\tunit: request.body.unit\n\t});\n\n\treturn { statusCode: HttpStatusCode.noContent };\n}\n\n/**\n * Add a telemetry metric value.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryAddMetricValue(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryAddMetricValueRequest\n): Promise<ICreatedResponse> {\n\tGuards.object<ITelemetryAddMetricValueRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryAddMetricValueRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\tGuards.object<ITelemetryAddMetricValueRequest[\"body\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.body),\n\t\trequest.body\n\t);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\tconst id = await component.addMetricValue(\n\t\trequest.pathParams.id,\n\t\trequest.body.value,\n\t\trequest.body.customData\n\t);\n\n\treturn { statusCode: HttpStatusCode.created, headers: { [HeaderTypes.Location]: id } };\n}\n\n/**\n * Removes a telemetry metric.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryRemoveMetric(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryRemoveMetricRequest\n): Promise<INoContentResponse> {\n\tGuards.object<ITelemetryRemoveMetricRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryRemoveMetricRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\tawait component.removeMetric(request.pathParams.id);\n\treturn {\n\t\tstatusCode: HttpStatusCode.noContent\n\t};\n}\n\n/**\n * Get a list of the telemetry metrics.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryMetricList(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryListRequest\n): Promise<ITelemetryListResponse> {\n\tGuards.object<ITelemetryListRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryListRequest[\"query\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.query),\n\t\trequest.query\n\t);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\n\tconst itemsAndCursor = await component.query(\n\t\tCoerce.number(request?.query?.type) as MetricType,\n\t\trequest?.query?.cursor,\n\t\tCoerce.number(request?.query?.limit)\n\t);\n\n\treturn {\n\t\tbody: itemsAndCursor\n\t};\n}\n\n/**\n * Get a list of the telemetry metric values.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryMetricValueList(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryValuesListRequest\n): Promise<ITelemetryValuesListResponse> {\n\tGuards.object<ITelemetryValuesListRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryValuesListRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.query),\n\t\trequest.query\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\n\tconst itemsAndCursor = await component.queryValues(\n\t\trequest?.pathParams.id,\n\t\tCoerce.number(request?.query?.timeStart),\n\t\tCoerce.number(request?.query?.timeEnd),\n\t\trequest?.query?.cursor,\n\t\tCoerce.number(request?.query?.limit)\n\t);\n\n\treturn {\n\t\tbody: itemsAndCursor\n\t};\n}\n"]}
1
+ {"version":3,"file":"telemetryRoutes.js","sourceRoot":"","sources":["../../src/telemetryRoutes.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright 2024 IOTA Stiftung.\n// SPDX-License-Identifier: Apache-2.0.\nimport type {\n\tICreatedResponse,\n\tIHttpRequestContext,\n\tINoContentResponse,\n\tIRestRoute,\n\tITag\n} from \"@twin.org/api-models\";\nimport { Coerce, ComponentFactory, Guards } from \"@twin.org/core\";\nimport { nameof } from \"@twin.org/nameof\";\nimport {\n\tMetricType,\n\ttype ITelemetryAddMetricValueRequest,\n\ttype ITelemetryComponent,\n\ttype ITelemetryCreateMetricRequest,\n\ttype ITelemetryGetMetricRequest,\n\ttype ITelemetryGetMetricResponse,\n\ttype ITelemetryListRequest,\n\ttype ITelemetryListResponse,\n\ttype ITelemetryRemoveMetricRequest,\n\ttype ITelemetryUpdateMetricRequest,\n\ttype ITelemetryValuesListRequest,\n\ttype ITelemetryValuesListResponse\n} from \"@twin.org/telemetry-models\";\nimport { HeaderTypes, HttpStatusCode } from \"@twin.org/web\";\n\n/**\n * The source used when communicating about these routes.\n */\nconst ROUTES_SOURCE = \"telemetryRoutes\";\n\n/**\n * The tag to associate with the routes.\n */\nexport const tagsTelemetry: ITag[] = [\n\t{\n\t\tname: \"Telemetry\",\n\t\tdescription: \"Endpoints which are modelled to access a telemetry contract.\"\n\t}\n];\n\n/**\n * The REST routes for telemetry.\n * @param baseRouteName Prefix to prepend to the paths.\n * @param componentName The name of the component to use in the routes stored in the ComponentFactory.\n * @returns The generated routes.\n */\nexport function generateRestRoutesTelemetry(\n\tbaseRouteName: string,\n\tcomponentName: string\n): IRestRoute[] {\n\tconst createMetricRoute: IRestRoute<ITelemetryCreateMetricRequest, ICreatedResponse> = {\n\t\toperationId: \"telemetryCreateMetric\",\n\t\tsummary: \"Create a telemetry metric\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/metric`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryCreateMetric(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryCreateMetricRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryCreateMetricRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tid: \"my-counter\",\n\t\t\t\t\t\t\tlabel: \"My Counter\",\n\t\t\t\t\t\t\tdescription: \"This is my counter\",\n\t\t\t\t\t\t\ttype: MetricType.Counter,\n\t\t\t\t\t\t\tunit: \"KG\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ICreatedResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"telemetryCreateMetricResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tstatusCode: HttpStatusCode.created,\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t[HeaderTypes.Location]: \"my-counter\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\tconst getMetricRoute: IRestRoute<ITelemetryGetMetricRequest, ITelemetryGetMetricResponse> = {\n\t\toperationId: \"telemetryGetMetric\",\n\t\tsummary: \"Get a telemetry metric and it's most recent value\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/metric/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryGetMetric(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryGetMetricRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryGetMetricRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ITelemetryGetMetricResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"telemetryGetMetricResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmetric: {\n\t\t\t\t\t\t\t\t\tid: \"my-counter\",\n\t\t\t\t\t\t\t\t\tlabel: \"My Counter\",\n\t\t\t\t\t\t\t\t\tdescription: \"This is my counter\",\n\t\t\t\t\t\t\t\t\ttype: MetricType.Counter,\n\t\t\t\t\t\t\t\t\tunit: \"KG\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tvalue: {\n\t\t\t\t\t\t\t\t\tid: \"aabbccdd11223445566\",\n\t\t\t\t\t\t\t\t\tts: 1715252922273,\n\t\t\t\t\t\t\t\t\tvalue: 10\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\tconst updateMetricRoute: IRestRoute<ITelemetryUpdateMetricRequest, INoContentResponse> = {\n\t\toperationId: \"telemetryUpdateMetric\",\n\t\tsummary: \"Update a telemetry metric\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"PUT\",\n\t\tpath: `${baseRouteName}/metric/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryUpdateMetric(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryUpdateMetricRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryUpdateMetricRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tlabel: \"My New Label\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<INoContentResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst addMetricValueRoute: IRestRoute<ITelemetryAddMetricValueRequest, ICreatedResponse> = {\n\t\toperationId: \"telemetryAddMetricValue\",\n\t\tsummary: \"Add a telemetry metric value\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"POST\",\n\t\tpath: `${baseRouteName}/metric/:id/value`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryAddMetricValue(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryAddMetricValueRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryAddMetricValueRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tvalue: 10\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryAddMetricValueIncRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\tvalue: \"inc\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ICreatedResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"telemetryAddMetricValueResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tstatusCode: HttpStatusCode.created,\n\t\t\t\t\t\t\theaders: {\n\t\t\t\t\t\t\t\t[HeaderTypes.Location]: \"aabbccdd11223445566\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\tconst removeMetricRoute: IRestRoute<ITelemetryRemoveMetricRequest, INoContentResponse> = {\n\t\toperationId: \"telemetryRemoveMetric\",\n\t\tsummary: \"Remove a telemetry metric and it's values.\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"DELETE\",\n\t\tpath: `${baseRouteName}/metric/:id`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryRemoveMetric(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryRemoveMetricRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryRemoveMetricRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<INoContentResponse>()\n\t\t\t}\n\t\t]\n\t};\n\n\tconst listMetricsRoute: IRestRoute<ITelemetryListRequest, ITelemetryListResponse> = {\n\t\toperationId: \"telemetryListEntries\",\n\t\tsummary: \"Get a list of the telemetry metrics\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/metric`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryMetricList(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryListRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryListRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tquery: {\n\t\t\t\t\t\t\ttype: MetricType.Counter.toString()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ITelemetryListResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"telemetryListResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tentities: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: \"my-counter\",\n\t\t\t\t\t\t\t\t\t\tlabel: \"My Counter\",\n\t\t\t\t\t\t\t\t\t\ttype: MetricType.Counter,\n\t\t\t\t\t\t\t\t\t\tunit: \"KG\"\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: \"my-counter-2\",\n\t\t\t\t\t\t\t\t\t\tlabel: \"My Counter 2\",\n\t\t\t\t\t\t\t\t\t\ttype: MetricType.IncDecCounter,\n\t\t\t\t\t\t\t\t\t\tunit: \"M\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tcursor: \"1\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\tconst listMetricsValuesRoute: IRestRoute<\n\t\tITelemetryValuesListRequest,\n\t\tITelemetryValuesListResponse\n\t> = {\n\t\toperationId: \"telemetryValuesListEntries\",\n\t\tsummary: \"Get a list of the values for a telemetry metric\",\n\t\ttag: tagsTelemetry[0].name,\n\t\tmethod: \"GET\",\n\t\tpath: `${baseRouteName}/metric/:id/value`,\n\t\thandler: async (httpRequestContext, request) =>\n\t\t\ttelemetryMetricValueList(httpRequestContext, componentName, request),\n\t\trequestType: {\n\t\t\ttype: nameof<ITelemetryValuesListRequest>(),\n\t\t\texamples: [\n\t\t\t\t{\n\t\t\t\t\tid: \"telemetryValuesListRequestExample\",\n\t\t\t\t\trequest: {\n\t\t\t\t\t\tpathParams: {\n\t\t\t\t\t\t\tid: \"my-counter\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tresponseType: [\n\t\t\t{\n\t\t\t\ttype: nameof<ITelemetryValuesListResponse>(),\n\t\t\t\texamples: [\n\t\t\t\t\t{\n\t\t\t\t\t\tid: \"telemetryValuesListResponseExample\",\n\t\t\t\t\t\tresponse: {\n\t\t\t\t\t\t\tbody: {\n\t\t\t\t\t\t\t\tmetric: {\n\t\t\t\t\t\t\t\t\tid: \"my-counter\",\n\t\t\t\t\t\t\t\t\tlabel: \"My Counter\",\n\t\t\t\t\t\t\t\t\ttype: MetricType.Counter,\n\t\t\t\t\t\t\t\t\tunit: \"KG\"\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\tentities: [\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: \"aabbccdd11223445566\",\n\t\t\t\t\t\t\t\t\t\tts: 1715252922273,\n\t\t\t\t\t\t\t\t\t\tvalue: 10\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tid: \"aabbccdd11223445566\",\n\t\t\t\t\t\t\t\t\t\tts: 1715252922274,\n\t\t\t\t\t\t\t\t\t\tvalue: 11\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\tcursor: \"1\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t};\n\n\treturn [\n\t\tcreateMetricRoute,\n\t\tgetMetricRoute,\n\t\tupdateMetricRoute,\n\t\taddMetricValueRoute,\n\t\tremoveMetricRoute,\n\t\tlistMetricsRoute,\n\t\tlistMetricsValuesRoute\n\t];\n}\n\n/**\n * Create a new telemetry metric.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryCreateMetric(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryCreateMetricRequest\n): Promise<ICreatedResponse> {\n\tGuards.object<ITelemetryCreateMetricRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryCreateMetricRequest[\"body\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.body),\n\t\trequest.body\n\t);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\tawait component.createMetric({\n\t\tid: request.body.id,\n\t\tlabel: request.body.label,\n\t\tdescription: request.body.description,\n\t\ttype: request.body.type,\n\t\tunit: request.body.unit\n\t});\n\treturn {\n\t\tstatusCode: HttpStatusCode.created,\n\t\theaders: {\n\t\t\t[HeaderTypes.Location]: request.body.id\n\t\t}\n\t};\n}\n\n/**\n * Gets a telemetry metric.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryGetMetric(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryGetMetricRequest\n): Promise<ITelemetryGetMetricResponse> {\n\tGuards.object<ITelemetryGetMetricRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryGetMetricRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\tconst result = await component.getMetric(request.pathParams.id);\n\treturn { body: result };\n}\n\n/**\n * Updates a telemetry metric.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryUpdateMetric(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryUpdateMetricRequest\n): Promise<INoContentResponse> {\n\tGuards.object<ITelemetryUpdateMetricRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryUpdateMetricRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\tGuards.object<ITelemetryUpdateMetricRequest[\"body\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.body),\n\t\trequest.body\n\t);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\tawait component.updateMetric({\n\t\tid: request.pathParams.id,\n\t\tlabel: request.body.label,\n\t\tdescription: request.body.description,\n\t\tunit: request.body.unit\n\t});\n\n\treturn { statusCode: HttpStatusCode.noContent };\n}\n\n/**\n * Add a telemetry metric value.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryAddMetricValue(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryAddMetricValueRequest\n): Promise<ICreatedResponse> {\n\tGuards.object<ITelemetryAddMetricValueRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryAddMetricValueRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\tGuards.object<ITelemetryAddMetricValueRequest[\"body\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.body),\n\t\trequest.body\n\t);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\tconst id = await component.addMetricValue(\n\t\trequest.pathParams.id,\n\t\trequest.body.value,\n\t\trequest.body.customData\n\t);\n\n\treturn { statusCode: HttpStatusCode.created, headers: { [HeaderTypes.Location]: id } };\n}\n\n/**\n * Removes a telemetry metric.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryRemoveMetric(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryRemoveMetricRequest\n): Promise<INoContentResponse> {\n\tGuards.object<ITelemetryRemoveMetricRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryRemoveMetricRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.pathParams),\n\t\trequest.pathParams\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\tawait component.removeMetric(request.pathParams.id);\n\treturn {\n\t\tstatusCode: HttpStatusCode.noContent\n\t};\n}\n\n/**\n * Get a list of the telemetry metrics.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryMetricList(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryListRequest\n): Promise<ITelemetryListResponse> {\n\tGuards.object<ITelemetryListRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryListRequest[\"query\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.query),\n\t\trequest.query\n\t);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\n\tconst itemsAndCursor = await component.query(\n\t\tCoerce.number(request?.query?.type) as MetricType,\n\t\trequest?.query?.cursor,\n\t\tCoerce.number(request?.query?.limit)\n\t);\n\n\treturn {\n\t\tbody: itemsAndCursor\n\t};\n}\n\n/**\n * Get a list of the telemetry metric values.\n * @param httpRequestContext The request context for the API.\n * @param componentName The name of the component to use in the routes.\n * @param request The request.\n * @returns The response object with additional http response properties.\n */\nexport async function telemetryMetricValueList(\n\thttpRequestContext: IHttpRequestContext,\n\tcomponentName: string,\n\trequest: ITelemetryValuesListRequest\n): Promise<ITelemetryValuesListResponse> {\n\tGuards.object<ITelemetryValuesListRequest>(ROUTES_SOURCE, nameof(request), request);\n\tGuards.object<ITelemetryValuesListRequest[\"pathParams\"]>(\n\t\tROUTES_SOURCE,\n\t\tnameof(request.query),\n\t\trequest.query\n\t);\n\tGuards.stringValue(ROUTES_SOURCE, nameof(request.pathParams.id), request.pathParams.id);\n\n\tconst component = ComponentFactory.get<ITelemetryComponent>(componentName);\n\n\tconst itemsAndCursor = await component.queryValues(\n\t\trequest?.pathParams.id,\n\t\tCoerce.number(request?.query?.timeStart),\n\t\tCoerce.number(request?.query?.timeEnd),\n\t\trequest?.query?.cursor,\n\t\tCoerce.number(request?.query?.limit)\n\t);\n\n\treturn {\n\t\tbody: itemsAndCursor\n\t};\n}\n"]}
package/docs/changelog.md CHANGED
@@ -1,24 +1,52 @@
1
- # @twin.org/telemetry-service - Changelog
1
+ # Changelog
2
2
 
3
- ## [0.0.3-next.1](https://github.com/twinfoundation/telemetry/compare/telemetry-service-v0.0.3-next.0...telemetry-service-v0.0.3-next.1) (2025-11-11)
3
+ ## [0.0.3-next.3](https://github.com/iotaledger/twin-telemetry/compare/telemetry-service-v0.0.3-next.2...telemetry-service-v0.0.3-next.3) (2026-05-06)
4
+
5
+
6
+ ### Miscellaneous Chores
7
+
8
+ * **telemetry-service:** Synchronize repo versions
9
+
10
+
11
+ ### Dependencies
12
+
13
+ * The following workspace dependencies were updated
14
+ * dependencies
15
+ * @twin.org/telemetry-models bumped from 0.0.3-next.2 to 0.0.3-next.3
16
+
17
+ ## [0.0.3-next.2](https://github.com/iotaledger/twin-telemetry/compare/telemetry-service-v0.0.3-next.1...telemetry-service-v0.0.3-next.2) (2026-03-02)
18
+
19
+
20
+ ### Bug Fixes
21
+
22
+ * api data types ([2edc5ac](https://github.com/iotaledger/twin-telemetry/commit/2edc5ac665b996a1b29173cac3b389fa3ceafa34))
23
+
24
+
25
+ ### Dependencies
26
+
27
+ * The following workspace dependencies were updated
28
+ * dependencies
29
+ * @twin.org/telemetry-models bumped from 0.0.3-next.1 to 0.0.3-next.2
30
+
31
+ ## [0.0.3-next.1](https://github.com/iotaledger/twin-telemetry/compare/telemetry-service-v0.0.3-next.0...telemetry-service-v0.0.3-next.1) (2025-11-11)
4
32
 
5
33
 
6
34
  ### Features
7
35
 
8
- * add context id features ([#19](https://github.com/twinfoundation/telemetry/issues/19)) ([5942442](https://github.com/twinfoundation/telemetry/commit/5942442991fa7ad7afa9d8b7c4583326a8c4c9ae))
9
- * add validate-locales ([24ed804](https://github.com/twinfoundation/telemetry/commit/24ed804f7ebc47036f323722bc18452729860c92))
10
- * eslint migration to flat config ([69ac91a](https://github.com/twinfoundation/telemetry/commit/69ac91a89d0b5bc63374a0bd314f770b557dabb4))
11
- * remove unused namespace ([54939fa](https://github.com/twinfoundation/telemetry/commit/54939faac3790dc1b51aa96a54005a03c99f98da))
12
- * remove unused namespace ([02dcabb](https://github.com/twinfoundation/telemetry/commit/02dcabbe00f5b03d5e4b2c12e655efac50409acf))
13
- * update dependencies ([0e55c48](https://github.com/twinfoundation/telemetry/commit/0e55c48de4139c6fe66b823101ca17973e60847c))
14
- * update framework core ([4b10bcd](https://github.com/twinfoundation/telemetry/commit/4b10bcd4d3101151671bdcf9aef7c54f5937fc2a))
15
- * use shared store mechanism ([#7](https://github.com/twinfoundation/telemetry/issues/7)) ([806fe2c](https://github.com/twinfoundation/telemetry/commit/806fe2c2b7653d6b949c27ebf57bd13c3e040242))
36
+ * add context id features ([#19](https://github.com/iotaledger/twin-telemetry/issues/19)) ([5942442](https://github.com/iotaledger/twin-telemetry/commit/5942442991fa7ad7afa9d8b7c4583326a8c4c9ae))
37
+ * add validate-locales ([24ed804](https://github.com/iotaledger/twin-telemetry/commit/24ed804f7ebc47036f323722bc18452729860c92))
38
+ * eslint migration to flat config ([69ac91a](https://github.com/iotaledger/twin-telemetry/commit/69ac91a89d0b5bc63374a0bd314f770b557dabb4))
39
+ * remove unused namespace ([54939fa](https://github.com/iotaledger/twin-telemetry/commit/54939faac3790dc1b51aa96a54005a03c99f98da))
40
+ * remove unused namespace ([02dcabb](https://github.com/iotaledger/twin-telemetry/commit/02dcabbe00f5b03d5e4b2c12e655efac50409acf))
41
+ * update dependencies ([0e55c48](https://github.com/iotaledger/twin-telemetry/commit/0e55c48de4139c6fe66b823101ca17973e60847c))
42
+ * update framework core ([4b10bcd](https://github.com/iotaledger/twin-telemetry/commit/4b10bcd4d3101151671bdcf9aef7c54f5937fc2a))
43
+ * use shared store mechanism ([#7](https://github.com/iotaledger/twin-telemetry/issues/7)) ([806fe2c](https://github.com/iotaledger/twin-telemetry/commit/806fe2c2b7653d6b949c27ebf57bd13c3e040242))
16
44
 
17
45
 
18
46
  ### Bug Fixes
19
47
 
20
- * query params force coercion ([ec7999e](https://github.com/twinfoundation/telemetry/commit/ec7999eadb66c65585efa19f3ce4cabb50eed761))
21
- * Update metric endpoint paths by removing trailing slashes and query type as string ([#3](https://github.com/twinfoundation/telemetry/issues/3)) ([b386ca5](https://github.com/twinfoundation/telemetry/commit/b386ca55404aa933ad8917f82a7f0e588593fcc8))
48
+ * query params force coercion ([ec7999e](https://github.com/iotaledger/twin-telemetry/commit/ec7999eadb66c65585efa19f3ce4cabb50eed761))
49
+ * Update metric endpoint paths by removing trailing slashes and query type as string ([#3](https://github.com/iotaledger/twin-telemetry/issues/3)) ([b386ca5](https://github.com/iotaledger/twin-telemetry/commit/b386ca55404aa933ad8917f82a7f0e588593fcc8))
22
50
 
23
51
 
24
52
  ### Dependencies
@@ -27,12 +55,12 @@
27
55
  * dependencies
28
56
  * @twin.org/telemetry-models bumped from 0.0.3-next.0 to 0.0.3-next.1
29
57
 
30
- ## [0.0.2-next.3](https://github.com/twinfoundation/telemetry/compare/telemetry-service-v0.0.2-next.2...telemetry-service-v0.0.2-next.3) (2025-10-09)
58
+ ## [0.0.2-next.3](https://github.com/iotaledger/twin-telemetry/compare/telemetry-service-v0.0.2-next.2...telemetry-service-v0.0.2-next.3) (2025-10-09)
31
59
 
32
60
 
33
61
  ### Features
34
62
 
35
- * add validate-locales ([24ed804](https://github.com/twinfoundation/telemetry/commit/24ed804f7ebc47036f323722bc18452729860c92))
63
+ * add validate-locales ([24ed804](https://github.com/iotaledger/twin-telemetry/commit/24ed804f7ebc47036f323722bc18452729860c92))
36
64
 
37
65
 
38
66
  ### Dependencies
@@ -41,12 +69,12 @@
41
69
  * dependencies
42
70
  * @twin.org/telemetry-models bumped from 0.0.2-next.2 to 0.0.2-next.3
43
71
 
44
- ## [0.0.2-next.2](https://github.com/twinfoundation/telemetry/compare/telemetry-service-v0.0.2-next.1...telemetry-service-v0.0.2-next.2) (2025-08-29)
72
+ ## [0.0.2-next.2](https://github.com/iotaledger/twin-telemetry/compare/telemetry-service-v0.0.2-next.1...telemetry-service-v0.0.2-next.2) (2025-08-29)
45
73
 
46
74
 
47
75
  ### Features
48
76
 
49
- * eslint migration to flat config ([69ac91a](https://github.com/twinfoundation/telemetry/commit/69ac91a89d0b5bc63374a0bd314f770b557dabb4))
77
+ * eslint migration to flat config ([69ac91a](https://github.com/iotaledger/twin-telemetry/commit/69ac91a89d0b5bc63374a0bd314f770b557dabb4))
50
78
 
51
79
 
52
80
  ### Dependencies
@@ -55,22 +83,22 @@
55
83
  * dependencies
56
84
  * @twin.org/telemetry-models bumped from 0.0.2-next.1 to 0.0.2-next.2
57
85
 
58
- ## [0.0.2-next.1](https://github.com/twinfoundation/telemetry/compare/telemetry-service-v0.0.2-next.0...telemetry-service-v0.0.2-next.1) (2025-08-20)
86
+ ## [0.0.2-next.1](https://github.com/iotaledger/twin-telemetry/compare/telemetry-service-v0.0.2-next.0...telemetry-service-v0.0.2-next.1) (2025-08-20)
59
87
 
60
88
 
61
89
  ### Features
62
90
 
63
- * remove unused namespace ([54939fa](https://github.com/twinfoundation/telemetry/commit/54939faac3790dc1b51aa96a54005a03c99f98da))
64
- * remove unused namespace ([02dcabb](https://github.com/twinfoundation/telemetry/commit/02dcabbe00f5b03d5e4b2c12e655efac50409acf))
65
- * update dependencies ([0e55c48](https://github.com/twinfoundation/telemetry/commit/0e55c48de4139c6fe66b823101ca17973e60847c))
66
- * update framework core ([4b10bcd](https://github.com/twinfoundation/telemetry/commit/4b10bcd4d3101151671bdcf9aef7c54f5937fc2a))
67
- * use shared store mechanism ([#7](https://github.com/twinfoundation/telemetry/issues/7)) ([806fe2c](https://github.com/twinfoundation/telemetry/commit/806fe2c2b7653d6b949c27ebf57bd13c3e040242))
91
+ * remove unused namespace ([54939fa](https://github.com/iotaledger/twin-telemetry/commit/54939faac3790dc1b51aa96a54005a03c99f98da))
92
+ * remove unused namespace ([02dcabb](https://github.com/iotaledger/twin-telemetry/commit/02dcabbe00f5b03d5e4b2c12e655efac50409acf))
93
+ * update dependencies ([0e55c48](https://github.com/iotaledger/twin-telemetry/commit/0e55c48de4139c6fe66b823101ca17973e60847c))
94
+ * update framework core ([4b10bcd](https://github.com/iotaledger/twin-telemetry/commit/4b10bcd4d3101151671bdcf9aef7c54f5937fc2a))
95
+ * use shared store mechanism ([#7](https://github.com/iotaledger/twin-telemetry/issues/7)) ([806fe2c](https://github.com/iotaledger/twin-telemetry/commit/806fe2c2b7653d6b949c27ebf57bd13c3e040242))
68
96
 
69
97
 
70
98
  ### Bug Fixes
71
99
 
72
- * query params force coercion ([ec7999e](https://github.com/twinfoundation/telemetry/commit/ec7999eadb66c65585efa19f3ce4cabb50eed761))
73
- * Update metric endpoint paths by removing trailing slashes and query type as string ([#3](https://github.com/twinfoundation/telemetry/issues/3)) ([b386ca5](https://github.com/twinfoundation/telemetry/commit/b386ca55404aa933ad8917f82a7f0e588593fcc8))
100
+ * query params force coercion ([ec7999e](https://github.com/iotaledger/twin-telemetry/commit/ec7999eadb66c65585efa19f3ce4cabb50eed761))
101
+ * Update metric endpoint paths by removing trailing slashes and query type as string ([#3](https://github.com/iotaledger/twin-telemetry/issues/3)) ([b386ca5](https://github.com/iotaledger/twin-telemetry/commit/b386ca55404aa933ad8917f82a7f0e588593fcc8))
74
102
 
75
103
 
76
104
  ### Dependencies
@@ -84,7 +112,7 @@
84
112
 
85
113
  ### Features
86
114
 
87
- * release to production ([df2151d](https://github.com/twinfoundation/telemetry/commit/df2151d24844fd2c3e6092ce3a6f888ac16219a0))
115
+ * release to production ([df2151d](https://github.com/iotaledger/twin-telemetry/commit/df2151d24844fd2c3e6092ce3a6f888ac16219a0))
88
116
 
89
117
 
90
118
  ### Dependencies
@@ -93,12 +121,12 @@
93
121
  * dependencies
94
122
  * @twin.org/telemetry-models bumped from ^0.0.0 to ^0.0.1
95
123
 
96
- ## [0.0.1-next.18](https://github.com/twinfoundation/telemetry/compare/telemetry-service-v0.0.1-next.17...telemetry-service-v0.0.1-next.18) (2025-06-20)
124
+ ## [0.0.1-next.18](https://github.com/iotaledger/twin-telemetry/compare/telemetry-service-v0.0.1-next.17...telemetry-service-v0.0.1-next.18) (2025-06-20)
97
125
 
98
126
 
99
127
  ### Bug Fixes
100
128
 
101
- * query params force coercion ([ec7999e](https://github.com/twinfoundation/telemetry/commit/ec7999eadb66c65585efa19f3ce4cabb50eed761))
129
+ * query params force coercion ([ec7999e](https://github.com/iotaledger/twin-telemetry/commit/ec7999eadb66c65585efa19f3ce4cabb50eed761))
102
130
 
103
131
 
104
132
  ### Dependencies
@@ -107,12 +135,12 @@
107
135
  * dependencies
108
136
  * @twin.org/telemetry-models bumped from 0.0.1-next.17 to 0.0.1-next.18
109
137
 
110
- ## [0.0.1-next.17](https://github.com/twinfoundation/telemetry/compare/telemetry-service-v0.0.1-next.16...telemetry-service-v0.0.1-next.17) (2025-06-12)
138
+ ## [0.0.1-next.17](https://github.com/iotaledger/twin-telemetry/compare/telemetry-service-v0.0.1-next.16...telemetry-service-v0.0.1-next.17) (2025-06-12)
111
139
 
112
140
 
113
141
  ### Features
114
142
 
115
- * update dependencies ([0e55c48](https://github.com/twinfoundation/telemetry/commit/0e55c48de4139c6fe66b823101ca17973e60847c))
143
+ * update dependencies ([0e55c48](https://github.com/iotaledger/twin-telemetry/commit/0e55c48de4139c6fe66b823101ca17973e60847c))
116
144
 
117
145
 
118
146
  ### Dependencies
@@ -121,12 +149,12 @@
121
149
  * dependencies
122
150
  * @twin.org/telemetry-models bumped from 0.0.1-next.16 to 0.0.1-next.17
123
151
 
124
- ## [0.0.1-next.16](https://github.com/twinfoundation/telemetry/compare/telemetry-service-v0.0.1-next.15...telemetry-service-v0.0.1-next.16) (2025-04-17)
152
+ ## [0.0.1-next.16](https://github.com/iotaledger/twin-telemetry/compare/telemetry-service-v0.0.1-next.15...telemetry-service-v0.0.1-next.16) (2025-04-17)
125
153
 
126
154
 
127
155
  ### Features
128
156
 
129
- * use shared store mechanism ([#7](https://github.com/twinfoundation/telemetry/issues/7)) ([806fe2c](https://github.com/twinfoundation/telemetry/commit/806fe2c2b7653d6b949c27ebf57bd13c3e040242))
157
+ * use shared store mechanism ([#7](https://github.com/iotaledger/twin-telemetry/issues/7)) ([806fe2c](https://github.com/iotaledger/twin-telemetry/commit/806fe2c2b7653d6b949c27ebf57bd13c3e040242))
130
158
 
131
159
 
132
160
  ### Dependencies
@@ -135,12 +163,12 @@
135
163
  * dependencies
136
164
  * @twin.org/telemetry-models bumped from 0.0.1-next.15 to 0.0.1-next.16
137
165
 
138
- ## [0.0.1-next.15](https://github.com/twinfoundation/telemetry/compare/telemetry-service-v0.0.1-next.14...telemetry-service-v0.0.1-next.15) (2025-03-28)
166
+ ## [0.0.1-next.15](https://github.com/iotaledger/twin-telemetry/compare/telemetry-service-v0.0.1-next.14...telemetry-service-v0.0.1-next.15) (2025-03-28)
139
167
 
140
168
 
141
169
  ### Bug Fixes
142
170
 
143
- * Update metric endpoint paths by removing trailing slashes and query type as string ([#3](https://github.com/twinfoundation/telemetry/issues/3)) ([b386ca5](https://github.com/twinfoundation/telemetry/commit/b386ca55404aa933ad8917f82a7f0e588593fcc8))
171
+ * Update metric endpoint paths by removing trailing slashes and query type as string ([#3](https://github.com/iotaledger/twin-telemetry/issues/3)) ([b386ca5](https://github.com/iotaledger/twin-telemetry/commit/b386ca55404aa933ad8917f82a7f0e588593fcc8))
144
172
 
145
173
 
146
174
  ### Dependencies
package/docs/examples.md CHANGED
@@ -1 +1,83 @@
1
- # @twin.org/telemetry-service - Examples
1
+ # Telemetry Service Examples
2
+
3
+ These examples show how to wire a service to a registered connector and expose telemetry operations in your application layer.
4
+
5
+ ## TelemetryService
6
+
7
+ ```typescript
8
+ import {
9
+ MetricType,
10
+ SilentTelemetryConnector,
11
+ TelemetryConnectorFactory
12
+ } from '@twin.org/telemetry-models';
13
+ import { TelemetryService } from '@twin.org/telemetry-service';
14
+
15
+ TelemetryConnectorFactory.register('silent', () => new SilentTelemetryConnector());
16
+
17
+ const service = new TelemetryService({
18
+ telemetryConnectorType: 'silent'
19
+ });
20
+
21
+ console.log(service.className()); // telemetryService
22
+
23
+ await service.createMetric({
24
+ id: 'requests-per-minute',
25
+ label: 'Requests Per Minute',
26
+ description: 'Request throughput sampled once per minute',
27
+ unit: 'rpm',
28
+ type: MetricType.Gauge
29
+ });
30
+
31
+ await service.updateMetric({
32
+ id: 'requests-per-minute',
33
+ label: 'RPM',
34
+ description: 'Request throughput',
35
+ unit: 'rpm'
36
+ });
37
+
38
+ const valueId = await service.addMetricValue('requests-per-minute', 118.7, {
39
+ region: 'eu-west-1'
40
+ });
41
+ console.log(valueId.length === 0); // true
42
+ ```
43
+
44
+ ```typescript
45
+ import {
46
+ MetricType,
47
+ SilentTelemetryConnector,
48
+ TelemetryConnectorFactory
49
+ } from '@twin.org/telemetry-models';
50
+ import { TelemetryService } from '@twin.org/telemetry-service';
51
+
52
+ TelemetryConnectorFactory.register('silent', () => new SilentTelemetryConnector());
53
+
54
+ const service = new TelemetryService({ telemetryConnectorType: 'silent' });
55
+
56
+ const metric = await service.getMetric('requests-per-minute');
57
+ console.log(metric.metric.id); // requests-per-minute
58
+
59
+ const metricPage = await service.query(MetricType.Gauge, undefined, 100);
60
+ console.log(metricPage.entities.length); // 1
61
+
62
+ const valuePage = await service.queryValues(
63
+ 'requests-per-minute',
64
+ Date.now() - 3_600_000,
65
+ Date.now(),
66
+ undefined,
67
+ 60
68
+ );
69
+ console.log(valuePage.entities.length); // 60
70
+
71
+ await service.removeMetric('requests-per-minute');
72
+ ```
73
+
74
+ ## generateRestRoutesTelemetry
75
+
76
+ ```typescript
77
+ import { generateRestRoutesTelemetry } from '@twin.org/telemetry-service';
78
+
79
+ const routes = generateRestRoutesTelemetry('/api', 'telemetry');
80
+
81
+ console.log(routes.length); // 7
82
+ console.log(routes[0].operationId); // telemetryCreateMetric
83
+ ```
@@ -56,15 +56,8 @@
56
56
  }
57
57
  },
58
58
  "responses": {
59
- "200": {
59
+ "201": {
60
60
  "description": "The rest request ended in created response.",
61
- "content": {
62
- "text/plain": {
63
- "schema": {
64
- "$ref": "#/components/schemas/CreatedResponse"
65
- }
66
- }
67
- },
68
61
  "headers": {
69
62
  "location": {
70
63
  "schema": {
@@ -73,6 +66,63 @@
73
66
  "description": "e.g. my-counter"
74
67
  }
75
68
  }
69
+ },
70
+ "400": {
71
+ "description": "The server cannot process the request, see the content for more details.",
72
+ "content": {
73
+ "application/json": {
74
+ "schema": {
75
+ "$ref": "#/components/schemas/Error"
76
+ },
77
+ "examples": {
78
+ "exampleResponse": {
79
+ "value": {
80
+ "name": "GeneralError",
81
+ "message": "errorMessage",
82
+ "properties": {
83
+ "foo": "bar"
84
+ }
85
+ }
86
+ }
87
+ }
88
+ }
89
+ }
90
+ },
91
+ "401": {
92
+ "description": "You are not authorized to use the API or no credentials were supplied, see the content for more details.",
93
+ "content": {
94
+ "application/json": {
95
+ "schema": {
96
+ "$ref": "#/components/schemas/Error"
97
+ },
98
+ "examples": {
99
+ "exampleResponse": {
100
+ "value": {
101
+ "name": "UnauthorizedError",
102
+ "message": "errorMessage"
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ },
109
+ "500": {
110
+ "description": "The server has encountered a situation it does not know how to handle, see the content for more details.",
111
+ "content": {
112
+ "application/json": {
113
+ "schema": {
114
+ "$ref": "#/components/schemas/Error"
115
+ },
116
+ "examples": {
117
+ "exampleResponse": {
118
+ "value": {
119
+ "name": "InternalServerError",
120
+ "message": "errorMessage"
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
76
126
  }
77
127
  }
78
128
  },
@@ -89,8 +139,9 @@
89
139
  "in": "query",
90
140
  "required": false,
91
141
  "schema": {
92
- "$ref": "#/components/schemas/MetricType"
93
- }
142
+ "type": "string"
143
+ },
144
+ "example": "0"
94
145
  },
95
146
  {
96
147
  "name": "cursor",
@@ -147,6 +198,63 @@
147
198
  }
148
199
  }
149
200
  }
201
+ },
202
+ "400": {
203
+ "description": "The server cannot process the request, see the content for more details.",
204
+ "content": {
205
+ "application/json": {
206
+ "schema": {
207
+ "$ref": "#/components/schemas/Error"
208
+ },
209
+ "examples": {
210
+ "exampleResponse": {
211
+ "value": {
212
+ "name": "GeneralError",
213
+ "message": "errorMessage",
214
+ "properties": {
215
+ "foo": "bar"
216
+ }
217
+ }
218
+ }
219
+ }
220
+ }
221
+ }
222
+ },
223
+ "401": {
224
+ "description": "You are not authorized to use the API or no credentials were supplied, see the content for more details.",
225
+ "content": {
226
+ "application/json": {
227
+ "schema": {
228
+ "$ref": "#/components/schemas/Error"
229
+ },
230
+ "examples": {
231
+ "exampleResponse": {
232
+ "value": {
233
+ "name": "UnauthorizedError",
234
+ "message": "errorMessage"
235
+ }
236
+ }
237
+ }
238
+ }
239
+ }
240
+ },
241
+ "500": {
242
+ "description": "The server has encountered a situation it does not know how to handle, see the content for more details.",
243
+ "content": {
244
+ "application/json": {
245
+ "schema": {
246
+ "$ref": "#/components/schemas/Error"
247
+ },
248
+ "examples": {
249
+ "exampleResponse": {
250
+ "value": {
251
+ "name": "InternalServerError",
252
+ "message": "errorMessage"
253
+ }
254
+ }
255
+ }
256
+ }
257
+ }
150
258
  }
151
259
  }
152
260
  }
@@ -204,6 +312,63 @@
204
312
  }
205
313
  }
206
314
  }
315
+ },
316
+ "400": {
317
+ "description": "The server cannot process the request, see the content for more details.",
318
+ "content": {
319
+ "application/json": {
320
+ "schema": {
321
+ "$ref": "#/components/schemas/Error"
322
+ },
323
+ "examples": {
324
+ "exampleResponse": {
325
+ "value": {
326
+ "name": "GeneralError",
327
+ "message": "errorMessage",
328
+ "properties": {
329
+ "foo": "bar"
330
+ }
331
+ }
332
+ }
333
+ }
334
+ }
335
+ }
336
+ },
337
+ "401": {
338
+ "description": "You are not authorized to use the API or no credentials were supplied, see the content for more details.",
339
+ "content": {
340
+ "application/json": {
341
+ "schema": {
342
+ "$ref": "#/components/schemas/Error"
343
+ },
344
+ "examples": {
345
+ "exampleResponse": {
346
+ "value": {
347
+ "name": "UnauthorizedError",
348
+ "message": "errorMessage"
349
+ }
350
+ }
351
+ }
352
+ }
353
+ }
354
+ },
355
+ "500": {
356
+ "description": "The server has encountered a situation it does not know how to handle, see the content for more details.",
357
+ "content": {
358
+ "application/json": {
359
+ "schema": {
360
+ "$ref": "#/components/schemas/Error"
361
+ },
362
+ "examples": {
363
+ "exampleResponse": {
364
+ "value": {
365
+ "name": "InternalServerError",
366
+ "message": "errorMessage"
367
+ }
368
+ }
369
+ }
370
+ }
371
+ }
207
372
  }
208
373
  }
209
374
  },
@@ -250,12 +415,62 @@
250
415
  }
251
416
  },
252
417
  "responses": {
253
- "200": {
254
- "description": "The rest request ended in success with no data.",
418
+ "204": {
419
+ "description": "The rest request ended in success with no data."
420
+ },
421
+ "400": {
422
+ "description": "The server cannot process the request, see the content for more details.",
423
+ "content": {
424
+ "application/json": {
425
+ "schema": {
426
+ "$ref": "#/components/schemas/Error"
427
+ },
428
+ "examples": {
429
+ "exampleResponse": {
430
+ "value": {
431
+ "name": "GeneralError",
432
+ "message": "errorMessage",
433
+ "properties": {
434
+ "foo": "bar"
435
+ }
436
+ }
437
+ }
438
+ }
439
+ }
440
+ }
441
+ },
442
+ "401": {
443
+ "description": "You are not authorized to use the API or no credentials were supplied, see the content for more details.",
255
444
  "content": {
256
- "text/plain": {
445
+ "application/json": {
257
446
  "schema": {
258
- "$ref": "#/components/schemas/NoContentResponse"
447
+ "$ref": "#/components/schemas/Error"
448
+ },
449
+ "examples": {
450
+ "exampleResponse": {
451
+ "value": {
452
+ "name": "UnauthorizedError",
453
+ "message": "errorMessage"
454
+ }
455
+ }
456
+ }
457
+ }
458
+ }
459
+ },
460
+ "500": {
461
+ "description": "The server has encountered a situation it does not know how to handle, see the content for more details.",
462
+ "content": {
463
+ "application/json": {
464
+ "schema": {
465
+ "$ref": "#/components/schemas/Error"
466
+ },
467
+ "examples": {
468
+ "exampleResponse": {
469
+ "value": {
470
+ "name": "InternalServerError",
471
+ "message": "errorMessage"
472
+ }
473
+ }
259
474
  }
260
475
  }
261
476
  }
@@ -287,12 +502,62 @@
287
502
  }
288
503
  ],
289
504
  "responses": {
290
- "200": {
291
- "description": "The rest request ended in success with no data.",
505
+ "204": {
506
+ "description": "The rest request ended in success with no data."
507
+ },
508
+ "400": {
509
+ "description": "The server cannot process the request, see the content for more details.",
292
510
  "content": {
293
- "text/plain": {
511
+ "application/json": {
294
512
  "schema": {
295
- "$ref": "#/components/schemas/NoContentResponse"
513
+ "$ref": "#/components/schemas/Error"
514
+ },
515
+ "examples": {
516
+ "exampleResponse": {
517
+ "value": {
518
+ "name": "GeneralError",
519
+ "message": "errorMessage",
520
+ "properties": {
521
+ "foo": "bar"
522
+ }
523
+ }
524
+ }
525
+ }
526
+ }
527
+ }
528
+ },
529
+ "401": {
530
+ "description": "You are not authorized to use the API or no credentials were supplied, see the content for more details.",
531
+ "content": {
532
+ "application/json": {
533
+ "schema": {
534
+ "$ref": "#/components/schemas/Error"
535
+ },
536
+ "examples": {
537
+ "exampleResponse": {
538
+ "value": {
539
+ "name": "UnauthorizedError",
540
+ "message": "errorMessage"
541
+ }
542
+ }
543
+ }
544
+ }
545
+ }
546
+ },
547
+ "500": {
548
+ "description": "The server has encountered a situation it does not know how to handle, see the content for more details.",
549
+ "content": {
550
+ "application/json": {
551
+ "schema": {
552
+ "$ref": "#/components/schemas/Error"
553
+ },
554
+ "examples": {
555
+ "exampleResponse": {
556
+ "value": {
557
+ "name": "InternalServerError",
558
+ "message": "errorMessage"
559
+ }
560
+ }
296
561
  }
297
562
  }
298
563
  }
@@ -349,15 +614,8 @@
349
614
  }
350
615
  },
351
616
  "responses": {
352
- "200": {
617
+ "201": {
353
618
  "description": "The rest request ended in created response.",
354
- "content": {
355
- "text/plain": {
356
- "schema": {
357
- "$ref": "#/components/schemas/CreatedResponse"
358
- }
359
- }
360
- },
361
619
  "headers": {
362
620
  "location": {
363
621
  "schema": {
@@ -366,6 +624,63 @@
366
624
  "description": "e.g. aabbccdd11223445566"
367
625
  }
368
626
  }
627
+ },
628
+ "400": {
629
+ "description": "The server cannot process the request, see the content for more details.",
630
+ "content": {
631
+ "application/json": {
632
+ "schema": {
633
+ "$ref": "#/components/schemas/Error"
634
+ },
635
+ "examples": {
636
+ "exampleResponse": {
637
+ "value": {
638
+ "name": "GeneralError",
639
+ "message": "errorMessage",
640
+ "properties": {
641
+ "foo": "bar"
642
+ }
643
+ }
644
+ }
645
+ }
646
+ }
647
+ }
648
+ },
649
+ "401": {
650
+ "description": "You are not authorized to use the API or no credentials were supplied, see the content for more details.",
651
+ "content": {
652
+ "application/json": {
653
+ "schema": {
654
+ "$ref": "#/components/schemas/Error"
655
+ },
656
+ "examples": {
657
+ "exampleResponse": {
658
+ "value": {
659
+ "name": "UnauthorizedError",
660
+ "message": "errorMessage"
661
+ }
662
+ }
663
+ }
664
+ }
665
+ }
666
+ },
667
+ "500": {
668
+ "description": "The server has encountered a situation it does not know how to handle, see the content for more details.",
669
+ "content": {
670
+ "application/json": {
671
+ "schema": {
672
+ "$ref": "#/components/schemas/Error"
673
+ },
674
+ "examples": {
675
+ "exampleResponse": {
676
+ "value": {
677
+ "name": "InternalServerError",
678
+ "message": "errorMessage"
679
+ }
680
+ }
681
+ }
682
+ }
683
+ }
369
684
  }
370
685
  }
371
686
  },
@@ -393,10 +708,7 @@
393
708
  "in": "query",
394
709
  "required": false,
395
710
  "schema": {
396
- "type": [
397
- "number",
398
- "string"
399
- ]
711
+ "type": "string"
400
712
  }
401
713
  },
402
714
  {
@@ -405,10 +717,7 @@
405
717
  "in": "query",
406
718
  "required": false,
407
719
  "schema": {
408
- "type": [
409
- "number",
410
- "string"
411
- ]
720
+ "type": "string"
412
721
  }
413
722
  },
414
723
  {
@@ -470,6 +779,63 @@
470
779
  }
471
780
  }
472
781
  }
782
+ },
783
+ "400": {
784
+ "description": "The server cannot process the request, see the content for more details.",
785
+ "content": {
786
+ "application/json": {
787
+ "schema": {
788
+ "$ref": "#/components/schemas/Error"
789
+ },
790
+ "examples": {
791
+ "exampleResponse": {
792
+ "value": {
793
+ "name": "GeneralError",
794
+ "message": "errorMessage",
795
+ "properties": {
796
+ "foo": "bar"
797
+ }
798
+ }
799
+ }
800
+ }
801
+ }
802
+ }
803
+ },
804
+ "401": {
805
+ "description": "You are not authorized to use the API or no credentials were supplied, see the content for more details.",
806
+ "content": {
807
+ "application/json": {
808
+ "schema": {
809
+ "$ref": "#/components/schemas/Error"
810
+ },
811
+ "examples": {
812
+ "exampleResponse": {
813
+ "value": {
814
+ "name": "UnauthorizedError",
815
+ "message": "errorMessage"
816
+ }
817
+ }
818
+ }
819
+ }
820
+ }
821
+ },
822
+ "500": {
823
+ "description": "The server has encountered a situation it does not know how to handle, see the content for more details.",
824
+ "content": {
825
+ "application/json": {
826
+ "schema": {
827
+ "$ref": "#/components/schemas/Error"
828
+ },
829
+ "examples": {
830
+ "exampleResponse": {
831
+ "value": {
832
+ "name": "InternalServerError",
833
+ "message": "errorMessage"
834
+ }
835
+ }
836
+ }
837
+ }
838
+ }
473
839
  }
474
840
  }
475
841
  }
@@ -477,25 +843,56 @@
477
843
  },
478
844
  "components": {
479
845
  "schemas": {
846
+ "Error": {
847
+ "description": "Model to describe serialized error.",
848
+ "type": "object",
849
+ "properties": {
850
+ "name": {
851
+ "type": "string",
852
+ "description": "The name for the error."
853
+ },
854
+ "message": {
855
+ "type": "string",
856
+ "description": "The message for the error as an i18n key."
857
+ },
858
+ "source": {
859
+ "type": "string",
860
+ "description": "The source of the error."
861
+ },
862
+ "properties": {
863
+ "type": "object",
864
+ "additionalProperties": {},
865
+ "description": "Any additional information for the error."
866
+ },
867
+ "stack": {
868
+ "type": "string",
869
+ "description": "The stack trace for the error."
870
+ },
871
+ "cause": {
872
+ "$ref": "#/components/schemas/Error"
873
+ }
874
+ },
875
+ "required": [
876
+ "name",
877
+ "message"
878
+ ]
879
+ },
480
880
  "MetricType": {
881
+ "description": "The types of metrics.",
481
882
  "anyOf": [
482
883
  {
483
- "type": "number",
484
884
  "const": 0,
485
885
  "description": "Counter."
486
886
  },
487
887
  {
488
- "type": "number",
489
888
  "const": 1,
490
889
  "description": "Increment Decrement Counter."
491
890
  },
492
891
  {
493
- "type": "number",
494
892
  "const": 2,
495
893
  "description": "Gauge."
496
894
  }
497
- ],
498
- "description": "The types of metrics."
895
+ ]
499
896
  },
500
897
  "TelemetryAddMetricValueRequest": {
501
898
  "type": "object",
@@ -503,11 +900,9 @@
503
900
  "value": {
504
901
  "anyOf": [
505
902
  {
506
- "type": "string",
507
903
  "const": "inc"
508
904
  },
509
905
  {
510
- "type": "string",
511
906
  "const": "dec"
512
907
  },
513
908
  {
@@ -525,7 +920,6 @@
525
920
  "required": [
526
921
  "value"
527
922
  ],
528
- "additionalProperties": false,
529
923
  "description": "The data to be used in the update."
530
924
  },
531
925
  "TelemetryGetMetricResponse": {
@@ -542,7 +936,6 @@
542
936
  "metric",
543
937
  "value"
544
938
  ],
545
- "additionalProperties": false,
546
939
  "description": "The body parameters."
547
940
  },
548
941
  "TelemetryListResponse": {
@@ -563,10 +956,10 @@
563
956
  "required": [
564
957
  "entities"
565
958
  ],
566
- "additionalProperties": false,
567
959
  "description": "The response payload."
568
960
  },
569
961
  "TelemetryMetric": {
962
+ "description": "Interface describing a telemetry metric.",
570
963
  "type": "object",
571
964
  "properties": {
572
965
  "id": {
@@ -587,17 +980,20 @@
587
980
  "unit": {
588
981
  "type": "string",
589
982
  "description": "The unit the metric describes."
983
+ },
984
+ "maxHistory": {
985
+ "type": "number",
986
+ "description": "The maximum number of values to retain; oldest are trimmed on each addMetricValue call.\nUnlimited when absent."
590
987
  }
591
988
  },
592
989
  "required": [
593
990
  "id",
594
991
  "label",
595
992
  "type"
596
- ],
597
- "additionalProperties": false,
598
- "description": "Interface describing a telemetry metric."
993
+ ]
599
994
  },
600
995
  "TelemetryMetricValue": {
996
+ "description": "Interface describing a telemetry metric value.",
601
997
  "type": "object",
602
998
  "properties": {
603
999
  "id": {
@@ -622,9 +1018,7 @@
622
1018
  "id",
623
1019
  "ts",
624
1020
  "value"
625
- ],
626
- "additionalProperties": false,
627
- "description": "Interface describing a telemetry metric value."
1021
+ ]
628
1022
  },
629
1023
  "TelemetryUpdateMetricRequest": {
630
1024
  "type": "object",
@@ -645,7 +1039,6 @@
645
1039
  "required": [
646
1040
  "label"
647
1041
  ],
648
- "additionalProperties": false,
649
1042
  "description": "The data to be used in the update."
650
1043
  },
651
1044
  "TelemetryValuesListResponse": {
@@ -670,7 +1063,6 @@
670
1063
  "metric",
671
1064
  "entities"
672
1065
  ],
673
- "additionalProperties": false,
674
1066
  "description": "The response payload."
675
1067
  }
676
1068
  },
@@ -28,7 +28,7 @@ The options for the connector.
28
28
 
29
29
  ## Properties
30
30
 
31
- ### CLASS\_NAME
31
+ ### CLASS\_NAME {#class_name}
32
32
 
33
33
  > `readonly` `static` **CLASS\_NAME**: `string`
34
34
 
@@ -36,7 +36,7 @@ Runtime name for the class.
36
36
 
37
37
  ## Methods
38
38
 
39
- ### className()
39
+ ### className() {#classname}
40
40
 
41
41
  > **className**(): `string`
42
42
 
@@ -54,7 +54,7 @@ The class name of the component.
54
54
 
55
55
  ***
56
56
 
57
- ### createMetric()
57
+ ### createMetric() {#createmetric}
58
58
 
59
59
  > **createMetric**(`metric`): `Promise`\<`void`\>
60
60
 
@@ -80,7 +80,7 @@ Nothing.
80
80
 
81
81
  ***
82
82
 
83
- ### getMetric()
83
+ ### getMetric() {#getmetric}
84
84
 
85
85
  > **getMetric**(`id`): `Promise`\<\{ `metric`: `ITelemetryMetric`; `value`: `ITelemetryMetricValue`; \}\>
86
86
 
@@ -106,7 +106,7 @@ The metric details and it's most recent value.
106
106
 
107
107
  ***
108
108
 
109
- ### updateMetric()
109
+ ### updateMetric() {#updatemetric}
110
110
 
111
111
  > **updateMetric**(`metric`): `Promise`\<`void`\>
112
112
 
@@ -132,7 +132,7 @@ Nothing.
132
132
 
133
133
  ***
134
134
 
135
- ### addMetricValue()
135
+ ### addMetricValue() {#addmetricvalue}
136
136
 
137
137
  > **addMetricValue**(`id`, `value`, `customData?`): `Promise`\<`string`\>
138
138
 
@@ -148,9 +148,9 @@ The id of the metric.
148
148
 
149
149
  ##### value
150
150
 
151
- The value for the add operation.
151
+ `number` \| `"inc"` \| `"dec"`
152
152
 
153
- `number` | `"inc"` | `"dec"`
153
+ The value for the add operation.
154
154
 
155
155
  ##### customData?
156
156
 
@@ -168,7 +168,7 @@ The created metric value id.
168
168
 
169
169
  ***
170
170
 
171
- ### removeMetric()
171
+ ### removeMetric() {#removemetric}
172
172
 
173
173
  > **removeMetric**(`id`): `Promise`\<`void`\>
174
174
 
@@ -194,7 +194,7 @@ Nothing.
194
194
 
195
195
  ***
196
196
 
197
- ### query()
197
+ ### query() {#query}
198
198
 
199
199
  > **query**(`type?`, `cursor?`, `limit?`): `Promise`\<\{ `entities`: `ITelemetryMetric`[]; `cursor?`: `string`; \}\>
200
200
 
@@ -237,7 +237,7 @@ NotImplementedError if the implementation does not support retrieval.
237
237
 
238
238
  ***
239
239
 
240
- ### queryValues()
240
+ ### queryValues() {#queryvalues}
241
241
 
242
242
  > **queryValues**(`id`, `timeStart?`, `timeEnd?`, `cursor?`, `limit?`): `Promise`\<\{ `metric`: `ITelemetryMetric`; `entities`: `ITelemetryMetricValue`[]; `cursor?`: `string`; \}\>
243
243
 
@@ -4,9 +4,9 @@ The options for the telemetry service constructor.
4
4
 
5
5
  ## Properties
6
6
 
7
- ### telemetryConnectorType?
7
+ ### telemetryConnectorType? {#telemetryconnectortype}
8
8
 
9
- > `optional` **telemetryConnectorType**: `string`
9
+ > `optional` **telemetryConnectorType?**: `string`
10
10
 
11
11
  The type of the telemetry connector to use.
12
12
 
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@twin.org/telemetry-service",
3
- "version": "0.0.3-next.1",
4
- "description": "Telemetry contract implementation and REST endpoint definitions",
3
+ "version": "0.0.3-next.3",
4
+ "description": "Telemetry service implementation with REST entry points.",
5
5
  "repository": {
6
6
  "type": "git",
7
- "url": "git+https://github.com/twinfoundation/telemetry.git",
7
+ "url": "git+https://github.com/iotaledger/telemetry.git",
8
8
  "directory": "packages/telemetry-service"
9
9
  },
10
10
  "author": "martyn.janes@iota.org",
@@ -18,7 +18,7 @@
18
18
  "@twin.org/core": "next",
19
19
  "@twin.org/entity": "next",
20
20
  "@twin.org/nameof": "next",
21
- "@twin.org/telemetry-models": "0.0.3-next.1",
21
+ "@twin.org/telemetry-models": "0.0.3-next.3",
22
22
  "@twin.org/web": "next"
23
23
  },
24
24
  "main": "./dist/es/index.js",
@@ -49,7 +49,7 @@
49
49
  "business-logic"
50
50
  ],
51
51
  "bugs": {
52
- "url": "git+https://github.com/twinfoundation/telemetry/issues"
52
+ "url": "git+https://github.com/iotaledger/telemetry/issues"
53
53
  },
54
54
  "homepage": "https://twindev.org"
55
55
  }