@microsoft/agents-hosting-storage-cosmos 1.5.0-beta.6.ga236d9a19c → 1.5.2
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/dist/package.json +42 -0
- package/dist/src/cosmosDbPartitionedStorage.js +76 -65
- package/dist/src/cosmosDbPartitionedStorage.js.map +1 -1
- package/dist/src/observability/index.d.ts +2 -0
- package/dist/src/observability/index.js +21 -0
- package/dist/src/observability/index.js.map +1 -0
- package/dist/src/observability/metrics.d.ts +3 -0
- package/dist/src/observability/metrics.js +13 -0
- package/dist/src/observability/metrics.js.map +1 -0
- package/dist/src/observability/traces.d.ts +11 -0
- package/dist/src/observability/traces.js +55 -0
- package/dist/src/observability/traces.js.map +1 -0
- package/package.json +5 -4
- package/src/cosmosDbPartitionedStorage.ts +118 -106
- package/src/observability/index.ts +5 -0
- package/src/observability/metrics.ts +11 -0
- package/src/observability/traces.ts +53 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/package.json",
|
|
3
|
+
"name": "@microsoft/agents-hosting-storage-cosmos",
|
|
4
|
+
"version": "1.5.2",
|
|
5
|
+
"homepage": "https://github.com/microsoft/Agents-for-js",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/microsoft/Agents-for-js.git"
|
|
9
|
+
},
|
|
10
|
+
"author": {
|
|
11
|
+
"name": "Microsoft",
|
|
12
|
+
"email": "agentssdk@microsoft.com",
|
|
13
|
+
"url": "https://aka.ms/Agents"
|
|
14
|
+
},
|
|
15
|
+
"description": "Microsoft 365 Agents SDK State Cosmos Storage support.",
|
|
16
|
+
"main": "dist/index.js",
|
|
17
|
+
"types": "dist/src/index.d.ts",
|
|
18
|
+
"dependencies": {
|
|
19
|
+
"@azure/cosmos": "4.9.1",
|
|
20
|
+
"@microsoft/agents-hosting": "1.5.2",
|
|
21
|
+
"@microsoft/agents-activity": "1.5.2",
|
|
22
|
+
"@microsoft/agents-telemetry": "1.5.2"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"files": [
|
|
26
|
+
"README.md",
|
|
27
|
+
"dist/src",
|
|
28
|
+
"src",
|
|
29
|
+
"package.json"
|
|
30
|
+
],
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/src/index.d.ts",
|
|
34
|
+
"import": "./dist/src/index.js",
|
|
35
|
+
"require": "./dist/src/index.js"
|
|
36
|
+
},
|
|
37
|
+
"./package.json": "./package.json"
|
|
38
|
+
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=20.0.0"
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -8,6 +8,8 @@ const cosmosDbKeyEscape_1 = require("./cosmosDbKeyEscape");
|
|
|
8
8
|
const documentStoreItem_1 = require("./documentStoreItem");
|
|
9
9
|
const agents_activity_1 = require("@microsoft/agents-activity");
|
|
10
10
|
const errorHelper_1 = require("./errorHelper");
|
|
11
|
+
const agents_telemetry_1 = require("@microsoft/agents-telemetry");
|
|
12
|
+
const observability_1 = require("./observability");
|
|
11
13
|
/**
|
|
12
14
|
* A utility class to ensure that a specific asynchronous task is executed only once for a given key.
|
|
13
15
|
* @typeParam T The type of the result returned by the asynchronous task.
|
|
@@ -80,90 +82,99 @@ class CosmosDbPartitionedStorage {
|
|
|
80
82
|
* @returns A promise that resolves to the read items.
|
|
81
83
|
*/
|
|
82
84
|
async read(keys) {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
else if (keys.length === 0) {
|
|
87
|
-
return {};
|
|
88
|
-
}
|
|
89
|
-
await this.initialize();
|
|
90
|
-
const storeItems = {};
|
|
91
|
-
await Promise.all(keys.map(async (k) => {
|
|
92
|
-
try {
|
|
93
|
-
const escapedKey = (0, cosmosDbKeyEscape_1.escapeKey)(k, this.cosmosDbStorageOptions.keySuffix, this.cosmosDbStorageOptions.compatibilityMode);
|
|
94
|
-
const readItemResponse = await this.container
|
|
95
|
-
.item(escapedKey, this.getPartitionKey(escapedKey))
|
|
96
|
-
.read();
|
|
97
|
-
const documentStoreItem = readItemResponse.resource;
|
|
98
|
-
if (documentStoreItem) {
|
|
99
|
-
storeItems[documentStoreItem.realId] = documentStoreItem.document;
|
|
100
|
-
storeItems[documentStoreItem.realId].eTag = documentStoreItem._etag;
|
|
101
|
-
}
|
|
85
|
+
return (0, agents_telemetry_1.trace)(observability_1.CosmosStorageTraceDefinitions.read, async ({ record }) => {
|
|
86
|
+
if (!keys) {
|
|
87
|
+
throw agents_activity_1.ExceptionHelper.generateException(ReferenceError, errorHelper_1.Errors.MissingReadKeys);
|
|
102
88
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
89
|
+
else if (keys.length === 0) {
|
|
90
|
+
return {};
|
|
91
|
+
}
|
|
92
|
+
record({ keyCount: keys === null || keys === void 0 ? void 0 : keys.length });
|
|
93
|
+
await this.initialize();
|
|
94
|
+
const storeItems = {};
|
|
95
|
+
await Promise.all(keys.map(async (k) => {
|
|
96
|
+
try {
|
|
97
|
+
const escapedKey = (0, cosmosDbKeyEscape_1.escapeKey)(k, this.cosmosDbStorageOptions.keySuffix, this.cosmosDbStorageOptions.compatibilityMode);
|
|
98
|
+
const readItemResponse = await this.container
|
|
99
|
+
.item(escapedKey, this.getPartitionKey(escapedKey))
|
|
100
|
+
.read();
|
|
101
|
+
const documentStoreItem = readItemResponse.resource;
|
|
102
|
+
if (documentStoreItem) {
|
|
103
|
+
storeItems[documentStoreItem.realId] = documentStoreItem.document;
|
|
104
|
+
storeItems[documentStoreItem.realId].eTag = documentStoreItem._etag;
|
|
105
|
+
}
|
|
109
106
|
}
|
|
110
|
-
|
|
111
|
-
|
|
107
|
+
catch (err) {
|
|
108
|
+
if (err.code === 404) {
|
|
109
|
+
// Not Found is not an error during read operations, just skip
|
|
110
|
+
}
|
|
111
|
+
else if (err.code === 400) {
|
|
112
|
+
throw agents_activity_1.ExceptionHelper.generateException(Error, errorHelper_1.Errors.ContainerReadBadRequest, err);
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
throw agents_activity_1.ExceptionHelper.generateException(Error, errorHelper_1.Errors.ContainerReadError, err);
|
|
116
|
+
}
|
|
112
117
|
}
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
|
|
118
|
+
}));
|
|
119
|
+
return storeItems;
|
|
120
|
+
});
|
|
116
121
|
}
|
|
117
122
|
/**
|
|
118
123
|
* Writes items to storage.
|
|
119
124
|
* @param changes The items to write.
|
|
120
125
|
*/
|
|
121
126
|
async write(changes) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
else if (changes.length === 0) {
|
|
126
|
-
return;
|
|
127
|
-
}
|
|
128
|
-
await this.initialize();
|
|
129
|
-
await Promise.all(Object.entries(changes).map(async ([key, { eTag, ...change }]) => {
|
|
130
|
-
const document = new documentStoreItem_1.DocumentStoreItem({
|
|
131
|
-
id: (0, cosmosDbKeyEscape_1.escapeKey)(key, this.cosmosDbStorageOptions.keySuffix, this.cosmosDbStorageOptions.compatibilityMode),
|
|
132
|
-
realId: key,
|
|
133
|
-
document: change,
|
|
134
|
-
});
|
|
135
|
-
const accessCondition = eTag !== '*' && eTag != null && eTag.length > 0
|
|
136
|
-
? { accessCondition: { type: 'IfMatch', condition: eTag } }
|
|
137
|
-
: undefined;
|
|
138
|
-
try {
|
|
139
|
-
await this.container.items.upsert(document, accessCondition);
|
|
127
|
+
return (0, agents_telemetry_1.trace)(observability_1.CosmosStorageTraceDefinitions.write, async ({ record }) => {
|
|
128
|
+
if (!changes) {
|
|
129
|
+
throw agents_activity_1.ExceptionHelper.generateException(ReferenceError, errorHelper_1.Errors.MissingWriteChanges);
|
|
140
130
|
}
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
throw agents_activity_1.ExceptionHelper.generateException(Error, errorHelper_1.Errors.DocumentUpsertError, err);
|
|
131
|
+
else if (changes.length === 0) {
|
|
132
|
+
return;
|
|
144
133
|
}
|
|
145
|
-
|
|
134
|
+
record({ keyCount: Object.keys(changes).length });
|
|
135
|
+
await this.initialize();
|
|
136
|
+
await Promise.all(Object.entries(changes).map(async ([key, { eTag, ...change }]) => {
|
|
137
|
+
const document = new documentStoreItem_1.DocumentStoreItem({
|
|
138
|
+
id: (0, cosmosDbKeyEscape_1.escapeKey)(key, this.cosmosDbStorageOptions.keySuffix, this.cosmosDbStorageOptions.compatibilityMode),
|
|
139
|
+
realId: key,
|
|
140
|
+
document: change,
|
|
141
|
+
});
|
|
142
|
+
const accessCondition = eTag !== '*' && eTag != null && eTag.length > 0
|
|
143
|
+
? { accessCondition: { type: 'IfMatch', condition: eTag } }
|
|
144
|
+
: undefined;
|
|
145
|
+
try {
|
|
146
|
+
await this.container.items.upsert(document, accessCondition);
|
|
147
|
+
}
|
|
148
|
+
catch (err) {
|
|
149
|
+
this.checkForNestingError(change, err);
|
|
150
|
+
throw agents_activity_1.ExceptionHelper.generateException(Error, errorHelper_1.Errors.DocumentUpsertError, err);
|
|
151
|
+
}
|
|
152
|
+
}));
|
|
153
|
+
});
|
|
146
154
|
}
|
|
147
155
|
/**
|
|
148
156
|
* Deletes items from storage.
|
|
149
157
|
* @param keys The keys of the items to delete.
|
|
150
158
|
*/
|
|
151
159
|
async delete(keys) {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
if (err.code === 404) {
|
|
160
|
-
// Not Found is not an error during delete operations, just skip
|
|
160
|
+
return (0, agents_telemetry_1.trace)(observability_1.CosmosStorageTraceDefinitions.delete, async ({ record }) => {
|
|
161
|
+
record({ keyCount: keys === null || keys === void 0 ? void 0 : keys.length });
|
|
162
|
+
await this.initialize();
|
|
163
|
+
await Promise.all(keys.map(async (k) => {
|
|
164
|
+
const escapedKey = (0, cosmosDbKeyEscape_1.escapeKey)(k, this.cosmosDbStorageOptions.keySuffix, this.cosmosDbStorageOptions.compatibilityMode);
|
|
165
|
+
try {
|
|
166
|
+
await this.container.item(escapedKey, this.getPartitionKey(escapedKey)).delete();
|
|
161
167
|
}
|
|
162
|
-
|
|
163
|
-
|
|
168
|
+
catch (err) {
|
|
169
|
+
if (err.code === 404) {
|
|
170
|
+
// Not Found is not an error during delete operations, just skip
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
throw agents_activity_1.ExceptionHelper.generateException(Error, errorHelper_1.Errors.DocumentDeleteError, err);
|
|
174
|
+
}
|
|
164
175
|
}
|
|
165
|
-
}
|
|
166
|
-
})
|
|
176
|
+
}));
|
|
177
|
+
});
|
|
167
178
|
}
|
|
168
179
|
/**
|
|
169
180
|
* Initializes the Cosmos DB container.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cosmosDbPartitionedStorage.js","sourceRoot":"","sources":["../../src/cosmosDbPartitionedStorage.ts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,kCAAkC;;;AAElC,0CAAuD;AACvD,2DAA+C;AAC/C,2DAAuD;AAGvD,gEAA4D;AAC5D,+CAAsC;
|
|
1
|
+
{"version":3,"file":"cosmosDbPartitionedStorage.js","sourceRoot":"","sources":["../../src/cosmosDbPartitionedStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
5
|
+
if (k2 === undefined) k2 = k;
|
|
6
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
7
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
8
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
9
|
+
}
|
|
10
|
+
Object.defineProperty(o, k2, desc);
|
|
11
|
+
}) : (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
o[k2] = m[k];
|
|
14
|
+
}));
|
|
15
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
16
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
17
|
+
};
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
__exportStar(require("./metrics"), exports);
|
|
20
|
+
__exportStar(require("./traces"), exports);
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/observability/index.ts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,kCAAkC;;;;;;;;;;;;;;;;AAElC,4CAAyB;AACzB,2CAAwB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.CosmosStorageMetrics = void 0;
|
|
6
|
+
const agents_telemetry_1 = require("@microsoft/agents-telemetry");
|
|
7
|
+
exports.CosmosStorageMetrics = {
|
|
8
|
+
storageOperationDuration: agents_telemetry_1.metric.histogram(agents_telemetry_1.MetricNames.STORAGE_OPERATION_DURATION, {
|
|
9
|
+
unit: 'ms',
|
|
10
|
+
description: 'Duration of storage operations in milliseconds'
|
|
11
|
+
})
|
|
12
|
+
};
|
|
13
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/observability/metrics.ts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,kCAAkC;;;AAElC,kEAAiE;AAEpD,QAAA,oBAAoB,GAAG;IAClC,wBAAwB,EAAE,yBAAM,CAAC,SAAS,CAAC,8BAAW,CAAC,0BAA0B,EAAE;QACjF,IAAI,EAAE,IAAI;QACV,WAAW,EAAE,gDAAgD;KAC9D,CAAC;CACH,CAAA"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export declare const CosmosStorageTraceDefinitions: {
|
|
2
|
+
read: import("@microsoft/agents-telemetry").TraceDefinition<{
|
|
3
|
+
keyCount: number;
|
|
4
|
+
}, object>;
|
|
5
|
+
write: import("@microsoft/agents-telemetry").TraceDefinition<{
|
|
6
|
+
keyCount: number;
|
|
7
|
+
}, object>;
|
|
8
|
+
delete: import("@microsoft/agents-telemetry").TraceDefinition<{
|
|
9
|
+
keyCount: number;
|
|
10
|
+
}, object>;
|
|
11
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
3
|
+
// Licensed under the MIT License.
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.CosmosStorageTraceDefinitions = void 0;
|
|
6
|
+
const agents_telemetry_1 = require("@microsoft/agents-telemetry");
|
|
7
|
+
const metrics_1 = require("./metrics");
|
|
8
|
+
exports.CosmosStorageTraceDefinitions = {
|
|
9
|
+
read: agents_telemetry_1.trace.define({
|
|
10
|
+
name: agents_telemetry_1.SpanNames.STORAGE_READ,
|
|
11
|
+
record: {
|
|
12
|
+
keyCount: 0,
|
|
13
|
+
},
|
|
14
|
+
end({ span, record, duration }) {
|
|
15
|
+
var _a;
|
|
16
|
+
const attributes = {
|
|
17
|
+
'storage.operation': 'read',
|
|
18
|
+
'storage.key.count': (_a = record.keyCount) !== null && _a !== void 0 ? _a : 0,
|
|
19
|
+
};
|
|
20
|
+
span.setAttributes(attributes);
|
|
21
|
+
metrics_1.CosmosStorageMetrics.storageOperationDuration.record(duration, attributes);
|
|
22
|
+
}
|
|
23
|
+
}),
|
|
24
|
+
write: agents_telemetry_1.trace.define({
|
|
25
|
+
name: agents_telemetry_1.SpanNames.STORAGE_WRITE,
|
|
26
|
+
record: {
|
|
27
|
+
keyCount: 0,
|
|
28
|
+
},
|
|
29
|
+
end({ span, record, duration }) {
|
|
30
|
+
var _a;
|
|
31
|
+
const attributes = {
|
|
32
|
+
'storage.operation': 'write',
|
|
33
|
+
'storage.key.count': (_a = record.keyCount) !== null && _a !== void 0 ? _a : 0,
|
|
34
|
+
};
|
|
35
|
+
span.setAttributes(attributes);
|
|
36
|
+
metrics_1.CosmosStorageMetrics.storageOperationDuration.record(duration, attributes);
|
|
37
|
+
}
|
|
38
|
+
}),
|
|
39
|
+
delete: agents_telemetry_1.trace.define({
|
|
40
|
+
name: agents_telemetry_1.SpanNames.STORAGE_DELETE,
|
|
41
|
+
record: {
|
|
42
|
+
keyCount: 0,
|
|
43
|
+
},
|
|
44
|
+
end({ span, record, duration }) {
|
|
45
|
+
var _a;
|
|
46
|
+
const attributes = {
|
|
47
|
+
'storage.operation': 'delete',
|
|
48
|
+
'storage.key.count': (_a = record.keyCount) !== null && _a !== void 0 ? _a : 0,
|
|
49
|
+
};
|
|
50
|
+
span.setAttributes(attributes);
|
|
51
|
+
metrics_1.CosmosStorageMetrics.storageOperationDuration.record(duration, attributes);
|
|
52
|
+
}
|
|
53
|
+
}),
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=traces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"traces.js","sourceRoot":"","sources":["../../../src/observability/traces.ts"],"names":[],"mappings":";AAAA,4DAA4D;AAC5D,kCAAkC;;;AAElC,kEAA8D;AAC9D,uCAAgD;AAEnC,QAAA,6BAA6B,GAAG;IAC3C,IAAI,EAAE,wBAAK,CAAC,MAAM,CAAC;QACjB,IAAI,EAAE,4BAAS,CAAC,YAAY;QAC5B,MAAM,EAAE;YACN,QAAQ,EAAE,CAAC;SACZ;QACD,GAAG,CAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE;;YAC7B,MAAM,UAAU,GAAG;gBACjB,mBAAmB,EAAE,MAAM;gBAC3B,mBAAmB,EAAE,MAAA,MAAM,CAAC,QAAQ,mCAAI,CAAC;aAC1C,CAAA;YAED,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;YAC9B,8BAAoB,CAAC,wBAAwB,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;QAC5E,CAAC;KACF,CAAC;IACF,KAAK,EAAE,wBAAK,CAAC,MAAM,CAAC;QAClB,IAAI,EAAE,4BAAS,CAAC,aAAa;QAC7B,MAAM,EAAE;YACN,QAAQ,EAAE,CAAC;SACZ;QACD,GAAG,CAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE;;YAC7B,MAAM,UAAU,GAAG;gBACjB,mBAAmB,EAAE,OAAO;gBAC5B,mBAAmB,EAAE,MAAA,MAAM,CAAC,QAAQ,mCAAI,CAAC;aAC1C,CAAA;YAED,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;YAC9B,8BAAoB,CAAC,wBAAwB,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;QAC5E,CAAC;KACF,CAAC;IACF,MAAM,EAAE,wBAAK,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,4BAAS,CAAC,cAAc;QAC9B,MAAM,EAAE;YACN,QAAQ,EAAE,CAAC;SACZ;QACD,GAAG,CAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE;;YAC7B,MAAM,UAAU,GAAG;gBACjB,mBAAmB,EAAE,QAAQ;gBAC7B,mBAAmB,EAAE,MAAA,MAAM,CAAC,QAAQ,mCAAI,CAAC;aAC1C,CAAA;YAED,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;YAC9B,8BAAoB,CAAC,wBAAwB,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;QAC5E,CAAC;KACF,CAAC;CACH,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/package.json",
|
|
3
3
|
"name": "@microsoft/agents-hosting-storage-cosmos",
|
|
4
|
-
"version": "1.5.
|
|
4
|
+
"version": "1.5.2",
|
|
5
5
|
"homepage": "https://github.com/microsoft/Agents-for-js",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -16,9 +16,10 @@
|
|
|
16
16
|
"main": "dist/index.js",
|
|
17
17
|
"types": "dist/src/index.d.ts",
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@azure/cosmos": "
|
|
20
|
-
"@microsoft/agents-hosting": "1.5.
|
|
21
|
-
"@microsoft/agents-activity": "1.5.
|
|
19
|
+
"@azure/cosmos": "4.9.1",
|
|
20
|
+
"@microsoft/agents-hosting": "1.5.2",
|
|
21
|
+
"@microsoft/agents-activity": "1.5.2",
|
|
22
|
+
"@microsoft/agents-telemetry": "1.5.2"
|
|
22
23
|
},
|
|
23
24
|
"license": "MIT",
|
|
24
25
|
"files": [
|
|
@@ -8,6 +8,8 @@ import { CosmosDbPartitionedStorageOptions } from './cosmosDbPartitionedStorageO
|
|
|
8
8
|
import { Storage, StoreItems } from '@microsoft/agents-hosting'
|
|
9
9
|
import { ExceptionHelper } from '@microsoft/agents-activity'
|
|
10
10
|
import { Errors } from './errorHelper'
|
|
11
|
+
import { trace } from '@microsoft/agents-telemetry'
|
|
12
|
+
import { CosmosStorageTraceDefinitions } from './observability'
|
|
11
13
|
|
|
12
14
|
/**
|
|
13
15
|
* A utility class to ensure that a specific asynchronous task is executed only once for a given key.
|
|
@@ -113,57 +115,60 @@ export class CosmosDbPartitionedStorage implements Storage {
|
|
|
113
115
|
* @returns A promise that resolves to the read items.
|
|
114
116
|
*/
|
|
115
117
|
async read (keys: string[]): Promise<StoreItems> {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
118
|
+
return trace(CosmosStorageTraceDefinitions.read, async ({ record }) => {
|
|
119
|
+
if (!keys) {
|
|
120
|
+
throw ExceptionHelper.generateException(
|
|
121
|
+
ReferenceError,
|
|
122
|
+
Errors.MissingReadKeys
|
|
123
|
+
)
|
|
124
|
+
} else if (keys.length === 0) {
|
|
125
|
+
return {}
|
|
126
|
+
}
|
|
124
127
|
|
|
125
|
-
|
|
128
|
+
record({ keyCount: keys?.length })
|
|
129
|
+
await this.initialize()
|
|
126
130
|
|
|
127
|
-
|
|
131
|
+
const storeItems: StoreItems = {}
|
|
128
132
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
)
|
|
137
|
-
|
|
138
|
-
const readItemResponse = await this.container
|
|
139
|
-
.item(escapedKey, this.getPartitionKey(escapedKey))
|
|
140
|
-
.read<DocumentStoreItem>()
|
|
141
|
-
const documentStoreItem = readItemResponse.resource
|
|
142
|
-
if (documentStoreItem) {
|
|
143
|
-
storeItems[documentStoreItem.realId] = documentStoreItem.document
|
|
144
|
-
storeItems[documentStoreItem.realId].eTag = documentStoreItem._etag
|
|
145
|
-
}
|
|
146
|
-
} catch (err: any) {
|
|
147
|
-
if (err.code === 404) {
|
|
148
|
-
// Not Found is not an error during read operations, just skip
|
|
149
|
-
} else if (err.code === 400) {
|
|
150
|
-
throw ExceptionHelper.generateException(
|
|
151
|
-
Error,
|
|
152
|
-
Errors.ContainerReadBadRequest,
|
|
153
|
-
err
|
|
154
|
-
)
|
|
155
|
-
} else {
|
|
156
|
-
throw ExceptionHelper.generateException(
|
|
157
|
-
Error,
|
|
158
|
-
Errors.ContainerReadError,
|
|
159
|
-
err
|
|
133
|
+
await Promise.all(
|
|
134
|
+
keys.map(async (k: string): Promise<void> => {
|
|
135
|
+
try {
|
|
136
|
+
const escapedKey = escapeKey(
|
|
137
|
+
k,
|
|
138
|
+
this.cosmosDbStorageOptions.keySuffix,
|
|
139
|
+
this.cosmosDbStorageOptions.compatibilityMode
|
|
160
140
|
)
|
|
141
|
+
|
|
142
|
+
const readItemResponse = await this.container
|
|
143
|
+
.item(escapedKey, this.getPartitionKey(escapedKey))
|
|
144
|
+
.read<DocumentStoreItem>()
|
|
145
|
+
const documentStoreItem = readItemResponse.resource
|
|
146
|
+
if (documentStoreItem) {
|
|
147
|
+
storeItems[documentStoreItem.realId] = documentStoreItem.document
|
|
148
|
+
storeItems[documentStoreItem.realId].eTag = documentStoreItem._etag
|
|
149
|
+
}
|
|
150
|
+
} catch (err: any) {
|
|
151
|
+
if (err.code === 404) {
|
|
152
|
+
// Not Found is not an error during read operations, just skip
|
|
153
|
+
} else if (err.code === 400) {
|
|
154
|
+
throw ExceptionHelper.generateException(
|
|
155
|
+
Error,
|
|
156
|
+
Errors.ContainerReadBadRequest,
|
|
157
|
+
err
|
|
158
|
+
)
|
|
159
|
+
} else {
|
|
160
|
+
throw ExceptionHelper.generateException(
|
|
161
|
+
Error,
|
|
162
|
+
Errors.ContainerReadError,
|
|
163
|
+
err
|
|
164
|
+
)
|
|
165
|
+
}
|
|
161
166
|
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
)
|
|
167
|
+
})
|
|
168
|
+
)
|
|
165
169
|
|
|
166
|
-
|
|
170
|
+
return storeItems
|
|
171
|
+
})
|
|
167
172
|
}
|
|
168
173
|
|
|
169
174
|
/**
|
|
@@ -171,46 +176,50 @@ export class CosmosDbPartitionedStorage implements Storage {
|
|
|
171
176
|
* @param changes The items to write.
|
|
172
177
|
*/
|
|
173
178
|
async write (changes: StoreItems): Promise<void> {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
await this.initialize()
|
|
179
|
+
return trace(CosmosStorageTraceDefinitions.write, async ({ record }) => {
|
|
180
|
+
if (!changes) {
|
|
181
|
+
throw ExceptionHelper.generateException(
|
|
182
|
+
ReferenceError,
|
|
183
|
+
Errors.MissingWriteChanges
|
|
184
|
+
)
|
|
185
|
+
} else if (changes.length === 0) {
|
|
186
|
+
return
|
|
187
|
+
}
|
|
184
188
|
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
189
|
+
record({ keyCount: Object.keys(changes).length })
|
|
190
|
+
|
|
191
|
+
await this.initialize()
|
|
192
|
+
|
|
193
|
+
await Promise.all(
|
|
194
|
+
Object.entries(changes).map(async ([key, { eTag, ...change }]): Promise<void> => {
|
|
195
|
+
const document = new DocumentStoreItem({
|
|
196
|
+
id: escapeKey(
|
|
197
|
+
key,
|
|
198
|
+
this.cosmosDbStorageOptions.keySuffix,
|
|
199
|
+
this.cosmosDbStorageOptions.compatibilityMode
|
|
200
|
+
),
|
|
201
|
+
realId: key,
|
|
202
|
+
document: change,
|
|
203
|
+
})
|
|
204
|
+
|
|
205
|
+
const accessCondition =
|
|
206
|
+
eTag !== '*' && eTag != null && eTag.length > 0
|
|
207
|
+
? { accessCondition: { type: 'IfMatch', condition: eTag } }
|
|
208
|
+
: undefined
|
|
209
|
+
|
|
210
|
+
try {
|
|
211
|
+
await this.container.items.upsert(document, accessCondition)
|
|
212
|
+
} catch (err: any) {
|
|
213
|
+
this.checkForNestingError(change, err)
|
|
214
|
+
throw ExceptionHelper.generateException(
|
|
215
|
+
Error,
|
|
216
|
+
Errors.DocumentUpsertError,
|
|
217
|
+
err
|
|
218
|
+
)
|
|
219
|
+
}
|
|
195
220
|
})
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
eTag !== '*' && eTag != null && eTag.length > 0
|
|
199
|
-
? { accessCondition: { type: 'IfMatch', condition: eTag } }
|
|
200
|
-
: undefined
|
|
201
|
-
|
|
202
|
-
try {
|
|
203
|
-
await this.container.items.upsert(document, accessCondition)
|
|
204
|
-
} catch (err: any) {
|
|
205
|
-
this.checkForNestingError(change, err)
|
|
206
|
-
throw ExceptionHelper.generateException(
|
|
207
|
-
Error,
|
|
208
|
-
Errors.DocumentUpsertError,
|
|
209
|
-
err
|
|
210
|
-
)
|
|
211
|
-
}
|
|
212
|
-
})
|
|
213
|
-
)
|
|
221
|
+
)
|
|
222
|
+
})
|
|
214
223
|
}
|
|
215
224
|
|
|
216
225
|
/**
|
|
@@ -218,30 +227,33 @@ export class CosmosDbPartitionedStorage implements Storage {
|
|
|
218
227
|
* @param keys The keys of the items to delete.
|
|
219
228
|
*/
|
|
220
229
|
async delete (keys: string[]): Promise<void> {
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
230
|
+
return trace(CosmosStorageTraceDefinitions.delete, async ({ record }) => {
|
|
231
|
+
record({ keyCount: keys?.length })
|
|
232
|
+
await this.initialize()
|
|
233
|
+
|
|
234
|
+
await Promise.all(
|
|
235
|
+
keys.map(async (k: string): Promise<void> => {
|
|
236
|
+
const escapedKey = escapeKey(
|
|
237
|
+
k,
|
|
238
|
+
this.cosmosDbStorageOptions.keySuffix,
|
|
239
|
+
this.cosmosDbStorageOptions.compatibilityMode
|
|
240
|
+
)
|
|
241
|
+
try {
|
|
242
|
+
await this.container.item(escapedKey, this.getPartitionKey(escapedKey)).delete()
|
|
243
|
+
} catch (err: any) {
|
|
244
|
+
if (err.code === 404) {
|
|
245
|
+
// Not Found is not an error during delete operations, just skip
|
|
246
|
+
} else {
|
|
247
|
+
throw ExceptionHelper.generateException(
|
|
248
|
+
Error,
|
|
249
|
+
Errors.DocumentDeleteError,
|
|
250
|
+
err
|
|
251
|
+
)
|
|
252
|
+
}
|
|
241
253
|
}
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
)
|
|
254
|
+
})
|
|
255
|
+
)
|
|
256
|
+
})
|
|
245
257
|
}
|
|
246
258
|
|
|
247
259
|
/**
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
|
|
4
|
+
import { metric, MetricNames } from '@microsoft/agents-telemetry'
|
|
5
|
+
|
|
6
|
+
export const CosmosStorageMetrics = {
|
|
7
|
+
storageOperationDuration: metric.histogram(MetricNames.STORAGE_OPERATION_DURATION, {
|
|
8
|
+
unit: 'ms',
|
|
9
|
+
description: 'Duration of storage operations in milliseconds'
|
|
10
|
+
})
|
|
11
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
2
|
+
// Licensed under the MIT License.
|
|
3
|
+
|
|
4
|
+
import { SpanNames, trace } from '@microsoft/agents-telemetry'
|
|
5
|
+
import { CosmosStorageMetrics } from './metrics'
|
|
6
|
+
|
|
7
|
+
export const CosmosStorageTraceDefinitions = {
|
|
8
|
+
read: trace.define({
|
|
9
|
+
name: SpanNames.STORAGE_READ,
|
|
10
|
+
record: {
|
|
11
|
+
keyCount: 0,
|
|
12
|
+
},
|
|
13
|
+
end ({ span, record, duration }) {
|
|
14
|
+
const attributes = {
|
|
15
|
+
'storage.operation': 'read',
|
|
16
|
+
'storage.key.count': record.keyCount ?? 0,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
span.setAttributes(attributes)
|
|
20
|
+
CosmosStorageMetrics.storageOperationDuration.record(duration, attributes)
|
|
21
|
+
}
|
|
22
|
+
}),
|
|
23
|
+
write: trace.define({
|
|
24
|
+
name: SpanNames.STORAGE_WRITE,
|
|
25
|
+
record: {
|
|
26
|
+
keyCount: 0,
|
|
27
|
+
},
|
|
28
|
+
end ({ span, record, duration }) {
|
|
29
|
+
const attributes = {
|
|
30
|
+
'storage.operation': 'write',
|
|
31
|
+
'storage.key.count': record.keyCount ?? 0,
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
span.setAttributes(attributes)
|
|
35
|
+
CosmosStorageMetrics.storageOperationDuration.record(duration, attributes)
|
|
36
|
+
}
|
|
37
|
+
}),
|
|
38
|
+
delete: trace.define({
|
|
39
|
+
name: SpanNames.STORAGE_DELETE,
|
|
40
|
+
record: {
|
|
41
|
+
keyCount: 0,
|
|
42
|
+
},
|
|
43
|
+
end ({ span, record, duration }) {
|
|
44
|
+
const attributes = {
|
|
45
|
+
'storage.operation': 'delete',
|
|
46
|
+
'storage.key.count': record.keyCount ?? 0,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
span.setAttributes(attributes)
|
|
50
|
+
CosmosStorageMetrics.storageOperationDuration.record(duration, attributes)
|
|
51
|
+
}
|
|
52
|
+
}),
|
|
53
|
+
}
|