@miradorlabs/web-grpc 2.9.0 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,6 +12,43 @@ import { ResponseStatus } from "../../common/v1/status";
12
12
 
13
13
  export const protobufPackage = "gateway.web.v1";
14
14
 
15
+ /**
16
+ * The signal a definition derives from. Log and metric sources are planned and will be added as
17
+ * new values; unset reads as TRACE.
18
+ */
19
+ export enum DerivedMetricSource {
20
+ DERIVED_METRIC_SOURCE_UNSPECIFIED = 0,
21
+ DERIVED_METRIC_SOURCE_TRACE = 1,
22
+ UNRECOGNIZED = -1,
23
+ }
24
+
25
+ export function derivedMetricSourceFromJSON(object: any): DerivedMetricSource {
26
+ switch (object) {
27
+ case 0:
28
+ case "DERIVED_METRIC_SOURCE_UNSPECIFIED":
29
+ return DerivedMetricSource.DERIVED_METRIC_SOURCE_UNSPECIFIED;
30
+ case 1:
31
+ case "DERIVED_METRIC_SOURCE_TRACE":
32
+ return DerivedMetricSource.DERIVED_METRIC_SOURCE_TRACE;
33
+ case -1:
34
+ case "UNRECOGNIZED":
35
+ default:
36
+ return DerivedMetricSource.UNRECOGNIZED;
37
+ }
38
+ }
39
+
40
+ export function derivedMetricSourceToJSON(object: DerivedMetricSource): string {
41
+ switch (object) {
42
+ case DerivedMetricSource.DERIVED_METRIC_SOURCE_UNSPECIFIED:
43
+ return "DERIVED_METRIC_SOURCE_UNSPECIFIED";
44
+ case DerivedMetricSource.DERIVED_METRIC_SOURCE_TRACE:
45
+ return "DERIVED_METRIC_SOURCE_TRACE";
46
+ case DerivedMetricSource.UNRECOGNIZED:
47
+ default:
48
+ return "UNRECOGNIZED";
49
+ }
50
+ }
51
+
15
52
  export enum DerivedMetricOutcome {
16
53
  DERIVED_METRIC_OUTCOME_UNSPECIFIED = 0,
17
54
  DERIVED_METRIC_OUTCOME_EMITTED = 1,
@@ -113,6 +150,64 @@ export function derivedMetricOutcomeToJSON(object: DerivedMetricOutcome): string
113
150
  }
114
151
  }
115
152
 
153
+ export enum DerivedMetricAttributeType {
154
+ DERIVED_METRIC_ATTRIBUTE_TYPE_UNSPECIFIED = 0,
155
+ DERIVED_METRIC_ATTRIBUTE_TYPE_STRING = 1,
156
+ DERIVED_METRIC_ATTRIBUTE_TYPE_BOOL = 2,
157
+ DERIVED_METRIC_ATTRIBUTE_TYPE_INT = 3,
158
+ DERIVED_METRIC_ATTRIBUTE_TYPE_DOUBLE = 4,
159
+ /** DERIVED_METRIC_ATTRIBUTE_TYPE_MIXED - The key was observed with more than one type across traces. */
160
+ DERIVED_METRIC_ATTRIBUTE_TYPE_MIXED = 5,
161
+ UNRECOGNIZED = -1,
162
+ }
163
+
164
+ export function derivedMetricAttributeTypeFromJSON(object: any): DerivedMetricAttributeType {
165
+ switch (object) {
166
+ case 0:
167
+ case "DERIVED_METRIC_ATTRIBUTE_TYPE_UNSPECIFIED":
168
+ return DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_UNSPECIFIED;
169
+ case 1:
170
+ case "DERIVED_METRIC_ATTRIBUTE_TYPE_STRING":
171
+ return DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_STRING;
172
+ case 2:
173
+ case "DERIVED_METRIC_ATTRIBUTE_TYPE_BOOL":
174
+ return DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_BOOL;
175
+ case 3:
176
+ case "DERIVED_METRIC_ATTRIBUTE_TYPE_INT":
177
+ return DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_INT;
178
+ case 4:
179
+ case "DERIVED_METRIC_ATTRIBUTE_TYPE_DOUBLE":
180
+ return DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_DOUBLE;
181
+ case 5:
182
+ case "DERIVED_METRIC_ATTRIBUTE_TYPE_MIXED":
183
+ return DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_MIXED;
184
+ case -1:
185
+ case "UNRECOGNIZED":
186
+ default:
187
+ return DerivedMetricAttributeType.UNRECOGNIZED;
188
+ }
189
+ }
190
+
191
+ export function derivedMetricAttributeTypeToJSON(object: DerivedMetricAttributeType): string {
192
+ switch (object) {
193
+ case DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_UNSPECIFIED:
194
+ return "DERIVED_METRIC_ATTRIBUTE_TYPE_UNSPECIFIED";
195
+ case DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_STRING:
196
+ return "DERIVED_METRIC_ATTRIBUTE_TYPE_STRING";
197
+ case DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_BOOL:
198
+ return "DERIVED_METRIC_ATTRIBUTE_TYPE_BOOL";
199
+ case DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_INT:
200
+ return "DERIVED_METRIC_ATTRIBUTE_TYPE_INT";
201
+ case DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_DOUBLE:
202
+ return "DERIVED_METRIC_ATTRIBUTE_TYPE_DOUBLE";
203
+ case DerivedMetricAttributeType.DERIVED_METRIC_ATTRIBUTE_TYPE_MIXED:
204
+ return "DERIVED_METRIC_ATTRIBUTE_TYPE_MIXED";
205
+ case DerivedMetricAttributeType.UNRECOGNIZED:
206
+ default:
207
+ return "UNRECOGNIZED";
208
+ }
209
+ }
210
+
116
211
  export interface DerivedMetric {
117
212
  id: string;
118
213
  organizationId: string;
@@ -128,6 +223,7 @@ export interface DerivedMetric {
128
223
  program: DerivedMetricProgram | undefined;
129
224
  createdAt: Date | undefined;
130
225
  updatedAt: Date | undefined;
226
+ source: DerivedMetricSource;
131
227
  }
132
228
 
133
229
  export interface DerivedMetricProgram {
@@ -140,10 +236,13 @@ export interface DerivedMetricProgram {
140
236
  /** Evaluates to a number, or to an empty optional meaning no sample. */
141
237
  valueExpression: string;
142
238
  /**
143
- * Optional. Evaluates to a string selecting the series -- one series per distinct value, the same
144
- * way any other metric groups. Empty, or unresolved, yields one unlabelled series.
239
+ * Trace attribute keys stamped onto every emitted point, so any dashboard widget can group or
240
+ * filter by any of them at read time -- one measurement, many groupings. At most four (the read
241
+ * side resolves four group-by keys). Values render canonically; a missing attribute becomes the
242
+ * empty string, never a dropped sample. Immutable after create: changing dimensions rewrites
243
+ * every series identity.
145
244
  */
146
- groupByExpression: string;
245
+ dimensions: string[];
147
246
  }
148
247
 
149
248
  export interface CreateDerivedMetricRequest {
@@ -155,6 +254,7 @@ export interface CreateDerivedMetricRequest {
155
254
  enabled: boolean;
156
255
  unit: string;
157
256
  program: DerivedMetricProgram | undefined;
257
+ source: DerivedMetricSource;
158
258
  }
159
259
 
160
260
  export interface CreateDerivedMetricResponse {
@@ -196,7 +296,7 @@ export interface UpdateDerivedMetricRequest_DerivedMetricUpdates {
196
296
  | string
197
297
  | undefined;
198
298
  /**
199
- * The measurement (population, value, group-by, unit, slug) is immutable -- changing it
299
+ * The measurement (population, value, dimensions, unit, slug) is immutable -- changing it
200
300
  * means a new metric.
201
301
  */
202
302
  enabled?: boolean | undefined;
@@ -249,8 +349,16 @@ export interface DryRunTraceResult {
249
349
 
250
350
  export interface DryRunEmission {
251
351
  value: number;
252
- /** The series this trace would land in. Empty when ungrouped or the group-by did not resolve. */
253
- groupValue: string;
352
+ /**
353
+ * Exactly one entry per declared dimension, rendered and truncated precisely as the persisted
354
+ * point attribute would be -- the preview must never disagree with the stored series.
355
+ */
356
+ resolvedDimensions: { [key: string]: string };
357
+ }
358
+
359
+ export interface DryRunEmission_ResolvedDimensionsEntry {
360
+ key: string;
361
+ value: string;
254
362
  }
255
363
 
256
364
  export interface DryRunNonEmission {
@@ -264,6 +372,48 @@ export interface DerivedMetricOutcomeCount {
264
372
  count: number;
265
373
  }
266
374
 
375
+ export interface ListDerivedMetricAttributesRequest {
376
+ organizationId: string;
377
+ projectId: string;
378
+ }
379
+
380
+ export interface ListDerivedMetricAttributesResponse {
381
+ status:
382
+ | ResponseStatus
383
+ | undefined;
384
+ /** Trace-level attributes: usable as dimensions, population filters, or trace-attribute operands. */
385
+ traceAttributes: DerivedMetricAttribute[];
386
+ /** Events observed on recent traces, each with the attribute keys seen on that event name. */
387
+ events: DerivedMetricEventAttributes[];
388
+ /**
389
+ * Finished traces the walk covered (oversized/unreadable histories count -- permanent skips are
390
+ * not truncation). traces_sampled < traces_selected means the request budget expired mid-walk and
391
+ * the catalog is a truncated sample a retry can improve on, same contract as the dry run.
392
+ */
393
+ tracesSampled: number;
394
+ /** Finished traces the walk selected; zero means the project has no history yet. */
395
+ tracesSelected: number;
396
+ /**
397
+ * True when an output cap (distinct event names or total keys) dropped entries -- the catalog is
398
+ * complete for what it lists, but more keys exist than fit in one response.
399
+ */
400
+ catalogCapped: boolean;
401
+ }
402
+
403
+ export interface DerivedMetricAttribute {
404
+ key: string;
405
+ /** The stored type, from the typed attribute payloads -- not inferred from rendered strings. */
406
+ type: DerivedMetricAttributeType;
407
+ /** A few observed values, rendered canonically. Never exhaustive. */
408
+ sampleValues: string[];
409
+ }
410
+
411
+ export interface DerivedMetricEventAttributes {
412
+ /** The event's author-facing name; only info/warn/error events carry one. */
413
+ name: string;
414
+ attributes: DerivedMetricAttribute[];
415
+ }
416
+
267
417
  function createBaseDerivedMetric(): DerivedMetric {
268
418
  return {
269
419
  id: "",
@@ -278,6 +428,7 @@ function createBaseDerivedMetric(): DerivedMetric {
278
428
  program: undefined,
279
429
  createdAt: undefined,
280
430
  updatedAt: undefined,
431
+ source: 0,
281
432
  };
282
433
  }
283
434
 
@@ -319,6 +470,9 @@ export const DerivedMetric: MessageFns<DerivedMetric> = {
319
470
  if (message.updatedAt !== undefined) {
320
471
  Timestamp.encode(toTimestamp(message.updatedAt), writer.uint32(98).fork()).join();
321
472
  }
473
+ if (message.source !== 0) {
474
+ writer.uint32(104).int32(message.source);
475
+ }
322
476
  return writer;
323
477
  },
324
478
 
@@ -425,6 +579,14 @@ export const DerivedMetric: MessageFns<DerivedMetric> = {
425
579
  message.updatedAt = fromTimestamp(Timestamp.decode(reader, reader.uint32()));
426
580
  continue;
427
581
  }
582
+ case 13: {
583
+ if (tag !== 104) {
584
+ break;
585
+ }
586
+
587
+ message.source = reader.int32() as any;
588
+ continue;
589
+ }
428
590
  }
429
591
  if ((tag & 7) === 4 || tag === 0) {
430
592
  break;
@@ -472,6 +634,7 @@ export const DerivedMetric: MessageFns<DerivedMetric> = {
472
634
  : isSet(object.updated_at)
473
635
  ? fromJsonTimestamp(object.updated_at)
474
636
  : undefined,
637
+ source: isSet(object.source) ? derivedMetricSourceFromJSON(object.source) : 0,
475
638
  };
476
639
  },
477
640
 
@@ -513,6 +676,9 @@ export const DerivedMetric: MessageFns<DerivedMetric> = {
513
676
  if (message.updatedAt !== undefined) {
514
677
  obj.updatedAt = message.updatedAt.toISOString();
515
678
  }
679
+ if (message.source !== 0) {
680
+ obj.source = derivedMetricSourceToJSON(message.source);
681
+ }
516
682
  return obj;
517
683
  },
518
684
 
@@ -535,12 +701,13 @@ export const DerivedMetric: MessageFns<DerivedMetric> = {
535
701
  : undefined;
536
702
  message.createdAt = object.createdAt ?? undefined;
537
703
  message.updatedAt = object.updatedAt ?? undefined;
704
+ message.source = object.source ?? 0;
538
705
  return message;
539
706
  },
540
707
  };
541
708
 
542
709
  function createBaseDerivedMetricProgram(): DerivedMetricProgram {
543
- return { populationExpression: "", valueExpression: "", groupByExpression: "" };
710
+ return { populationExpression: "", valueExpression: "", dimensions: [] };
544
711
  }
545
712
 
546
713
  export const DerivedMetricProgram: MessageFns<DerivedMetricProgram> = {
@@ -551,8 +718,8 @@ export const DerivedMetricProgram: MessageFns<DerivedMetricProgram> = {
551
718
  if (message.valueExpression !== "") {
552
719
  writer.uint32(18).string(message.valueExpression);
553
720
  }
554
- if (message.groupByExpression !== "") {
555
- writer.uint32(26).string(message.groupByExpression);
721
+ for (const v of message.dimensions) {
722
+ writer.uint32(34).string(v!);
556
723
  }
557
724
  return writer;
558
725
  },
@@ -580,12 +747,12 @@ export const DerivedMetricProgram: MessageFns<DerivedMetricProgram> = {
580
747
  message.valueExpression = reader.string();
581
748
  continue;
582
749
  }
583
- case 3: {
584
- if (tag !== 26) {
750
+ case 4: {
751
+ if (tag !== 34) {
585
752
  break;
586
753
  }
587
754
 
588
- message.groupByExpression = reader.string();
755
+ message.dimensions.push(reader.string());
589
756
  continue;
590
757
  }
591
758
  }
@@ -609,11 +776,9 @@ export const DerivedMetricProgram: MessageFns<DerivedMetricProgram> = {
609
776
  : isSet(object.value_expression)
610
777
  ? globalThis.String(object.value_expression)
611
778
  : "",
612
- groupByExpression: isSet(object.groupByExpression)
613
- ? globalThis.String(object.groupByExpression)
614
- : isSet(object.group_by_expression)
615
- ? globalThis.String(object.group_by_expression)
616
- : "",
779
+ dimensions: globalThis.Array.isArray(object?.dimensions)
780
+ ? object.dimensions.map((e: any) => globalThis.String(e))
781
+ : [],
617
782
  };
618
783
  },
619
784
 
@@ -625,8 +790,8 @@ export const DerivedMetricProgram: MessageFns<DerivedMetricProgram> = {
625
790
  if (message.valueExpression !== "") {
626
791
  obj.valueExpression = message.valueExpression;
627
792
  }
628
- if (message.groupByExpression !== "") {
629
- obj.groupByExpression = message.groupByExpression;
793
+ if (message.dimensions?.length) {
794
+ obj.dimensions = message.dimensions;
630
795
  }
631
796
  return obj;
632
797
  },
@@ -638,7 +803,7 @@ export const DerivedMetricProgram: MessageFns<DerivedMetricProgram> = {
638
803
  const message = createBaseDerivedMetricProgram();
639
804
  message.populationExpression = object.populationExpression ?? "";
640
805
  message.valueExpression = object.valueExpression ?? "";
641
- message.groupByExpression = object.groupByExpression ?? "";
806
+ message.dimensions = object.dimensions?.map((e) => e) || [];
642
807
  return message;
643
808
  },
644
809
  };
@@ -653,6 +818,7 @@ function createBaseCreateDerivedMetricRequest(): CreateDerivedMetricRequest {
653
818
  enabled: false,
654
819
  unit: "",
655
820
  program: undefined,
821
+ source: 0,
656
822
  };
657
823
  }
658
824
 
@@ -682,6 +848,9 @@ export const CreateDerivedMetricRequest: MessageFns<CreateDerivedMetricRequest>
682
848
  if (message.program !== undefined) {
683
849
  DerivedMetricProgram.encode(message.program, writer.uint32(66).fork()).join();
684
850
  }
851
+ if (message.source !== 0) {
852
+ writer.uint32(72).int32(message.source);
853
+ }
685
854
  return writer;
686
855
  },
687
856
 
@@ -756,6 +925,14 @@ export const CreateDerivedMetricRequest: MessageFns<CreateDerivedMetricRequest>
756
925
  message.program = DerivedMetricProgram.decode(reader, reader.uint32());
757
926
  continue;
758
927
  }
928
+ case 9: {
929
+ if (tag !== 72) {
930
+ break;
931
+ }
932
+
933
+ message.source = reader.int32() as any;
934
+ continue;
935
+ }
759
936
  }
760
937
  if ((tag & 7) === 4 || tag === 0) {
761
938
  break;
@@ -787,6 +964,7 @@ export const CreateDerivedMetricRequest: MessageFns<CreateDerivedMetricRequest>
787
964
  enabled: isSet(object.enabled) ? globalThis.Boolean(object.enabled) : false,
788
965
  unit: isSet(object.unit) ? globalThis.String(object.unit) : "",
789
966
  program: isSet(object.program) ? DerivedMetricProgram.fromJSON(object.program) : undefined,
967
+ source: isSet(object.source) ? derivedMetricSourceFromJSON(object.source) : 0,
790
968
  };
791
969
  },
792
970
 
@@ -816,6 +994,9 @@ export const CreateDerivedMetricRequest: MessageFns<CreateDerivedMetricRequest>
816
994
  if (message.program !== undefined) {
817
995
  obj.program = DerivedMetricProgram.toJSON(message.program);
818
996
  }
997
+ if (message.source !== 0) {
998
+ obj.source = derivedMetricSourceToJSON(message.source);
999
+ }
819
1000
  return obj;
820
1001
  },
821
1002
 
@@ -834,6 +1015,7 @@ export const CreateDerivedMetricRequest: MessageFns<CreateDerivedMetricRequest>
834
1015
  message.program = (object.program !== undefined && object.program !== null)
835
1016
  ? DerivedMetricProgram.fromPartial(object.program)
836
1017
  : undefined;
1018
+ message.source = object.source ?? 0;
837
1019
  return message;
838
1020
  },
839
1021
  };
@@ -2102,7 +2284,7 @@ export const DryRunTraceResult: MessageFns<DryRunTraceResult> = {
2102
2284
  };
2103
2285
 
2104
2286
  function createBaseDryRunEmission(): DryRunEmission {
2105
- return { value: 0, groupValue: "" };
2287
+ return { value: 0, resolvedDimensions: {} };
2106
2288
  }
2107
2289
 
2108
2290
  export const DryRunEmission: MessageFns<DryRunEmission> = {
@@ -2110,9 +2292,9 @@ export const DryRunEmission: MessageFns<DryRunEmission> = {
2110
2292
  if (message.value !== 0) {
2111
2293
  writer.uint32(9).double(message.value);
2112
2294
  }
2113
- if (message.groupValue !== "") {
2114
- writer.uint32(18).string(message.groupValue);
2115
- }
2295
+ globalThis.Object.entries(message.resolvedDimensions).forEach(([key, value]: [string, string]) => {
2296
+ DryRunEmission_ResolvedDimensionsEntry.encode({ key: key as any, value }, writer.uint32(26).fork()).join();
2297
+ });
2116
2298
  return writer;
2117
2299
  },
2118
2300
 
@@ -2131,12 +2313,15 @@ export const DryRunEmission: MessageFns<DryRunEmission> = {
2131
2313
  message.value = reader.double();
2132
2314
  continue;
2133
2315
  }
2134
- case 2: {
2135
- if (tag !== 18) {
2316
+ case 3: {
2317
+ if (tag !== 26) {
2136
2318
  break;
2137
2319
  }
2138
2320
 
2139
- message.groupValue = reader.string();
2321
+ const entry3 = DryRunEmission_ResolvedDimensionsEntry.decode(reader, reader.uint32());
2322
+ if (entry3.value !== undefined) {
2323
+ message.resolvedDimensions[entry3.key] = entry3.value;
2324
+ }
2140
2325
  continue;
2141
2326
  }
2142
2327
  }
@@ -2151,11 +2336,23 @@ export const DryRunEmission: MessageFns<DryRunEmission> = {
2151
2336
  fromJSON(object: any): DryRunEmission {
2152
2337
  return {
2153
2338
  value: isSet(object.value) ? globalThis.Number(object.value) : 0,
2154
- groupValue: isSet(object.groupValue)
2155
- ? globalThis.String(object.groupValue)
2156
- : isSet(object.group_value)
2157
- ? globalThis.String(object.group_value)
2158
- : "",
2339
+ resolvedDimensions: isObject(object.resolvedDimensions)
2340
+ ? (globalThis.Object.entries(object.resolvedDimensions) as [string, any][]).reduce(
2341
+ (acc: { [key: string]: string }, [key, value]: [string, any]) => {
2342
+ acc[key] = globalThis.String(value);
2343
+ return acc;
2344
+ },
2345
+ {},
2346
+ )
2347
+ : isObject(object.resolved_dimensions)
2348
+ ? (globalThis.Object.entries(object.resolved_dimensions) as [string, any][]).reduce(
2349
+ (acc: { [key: string]: string }, [key, value]: [string, any]) => {
2350
+ acc[key] = globalThis.String(value);
2351
+ return acc;
2352
+ },
2353
+ {},
2354
+ )
2355
+ : {},
2159
2356
  };
2160
2357
  },
2161
2358
 
@@ -2164,8 +2361,14 @@ export const DryRunEmission: MessageFns<DryRunEmission> = {
2164
2361
  if (message.value !== 0) {
2165
2362
  obj.value = message.value;
2166
2363
  }
2167
- if (message.groupValue !== "") {
2168
- obj.groupValue = message.groupValue;
2364
+ if (message.resolvedDimensions) {
2365
+ const entries = globalThis.Object.entries(message.resolvedDimensions) as [string, string][];
2366
+ if (entries.length > 0) {
2367
+ obj.resolvedDimensions = {};
2368
+ entries.forEach(([k, v]) => {
2369
+ obj.resolvedDimensions[k] = v;
2370
+ });
2371
+ }
2169
2372
  }
2170
2373
  return obj;
2171
2374
  },
@@ -2176,7 +2379,93 @@ export const DryRunEmission: MessageFns<DryRunEmission> = {
2176
2379
  fromPartial<I extends Exact<DeepPartial<DryRunEmission>, I>>(object: I): DryRunEmission {
2177
2380
  const message = createBaseDryRunEmission();
2178
2381
  message.value = object.value ?? 0;
2179
- message.groupValue = object.groupValue ?? "";
2382
+ message.resolvedDimensions = (globalThis.Object.entries(object.resolvedDimensions ?? {}) as [string, string][])
2383
+ .reduce((acc: { [key: string]: string }, [key, value]: [string, string]) => {
2384
+ if (value !== undefined) {
2385
+ acc[key] = globalThis.String(value);
2386
+ }
2387
+ return acc;
2388
+ }, {});
2389
+ return message;
2390
+ },
2391
+ };
2392
+
2393
+ function createBaseDryRunEmission_ResolvedDimensionsEntry(): DryRunEmission_ResolvedDimensionsEntry {
2394
+ return { key: "", value: "" };
2395
+ }
2396
+
2397
+ export const DryRunEmission_ResolvedDimensionsEntry: MessageFns<DryRunEmission_ResolvedDimensionsEntry> = {
2398
+ encode(message: DryRunEmission_ResolvedDimensionsEntry, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
2399
+ if (message.key !== "") {
2400
+ writer.uint32(10).string(message.key);
2401
+ }
2402
+ if (message.value !== "") {
2403
+ writer.uint32(18).string(message.value);
2404
+ }
2405
+ return writer;
2406
+ },
2407
+
2408
+ decode(input: BinaryReader | Uint8Array, length?: number): DryRunEmission_ResolvedDimensionsEntry {
2409
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
2410
+ const end = length === undefined ? reader.len : reader.pos + length;
2411
+ const message = createBaseDryRunEmission_ResolvedDimensionsEntry();
2412
+ while (reader.pos < end) {
2413
+ const tag = reader.uint32();
2414
+ switch (tag >>> 3) {
2415
+ case 1: {
2416
+ if (tag !== 10) {
2417
+ break;
2418
+ }
2419
+
2420
+ message.key = reader.string();
2421
+ continue;
2422
+ }
2423
+ case 2: {
2424
+ if (tag !== 18) {
2425
+ break;
2426
+ }
2427
+
2428
+ message.value = reader.string();
2429
+ continue;
2430
+ }
2431
+ }
2432
+ if ((tag & 7) === 4 || tag === 0) {
2433
+ break;
2434
+ }
2435
+ reader.skip(tag & 7);
2436
+ }
2437
+ return message;
2438
+ },
2439
+
2440
+ fromJSON(object: any): DryRunEmission_ResolvedDimensionsEntry {
2441
+ return {
2442
+ key: isSet(object.key) ? globalThis.String(object.key) : "",
2443
+ value: isSet(object.value) ? globalThis.String(object.value) : "",
2444
+ };
2445
+ },
2446
+
2447
+ toJSON(message: DryRunEmission_ResolvedDimensionsEntry): unknown {
2448
+ const obj: any = {};
2449
+ if (message.key !== "") {
2450
+ obj.key = message.key;
2451
+ }
2452
+ if (message.value !== "") {
2453
+ obj.value = message.value;
2454
+ }
2455
+ return obj;
2456
+ },
2457
+
2458
+ create<I extends Exact<DeepPartial<DryRunEmission_ResolvedDimensionsEntry>, I>>(
2459
+ base?: I,
2460
+ ): DryRunEmission_ResolvedDimensionsEntry {
2461
+ return DryRunEmission_ResolvedDimensionsEntry.fromPartial(base ?? ({} as any));
2462
+ },
2463
+ fromPartial<I extends Exact<DeepPartial<DryRunEmission_ResolvedDimensionsEntry>, I>>(
2464
+ object: I,
2465
+ ): DryRunEmission_ResolvedDimensionsEntry {
2466
+ const message = createBaseDryRunEmission_ResolvedDimensionsEntry();
2467
+ message.key = object.key ?? "";
2468
+ message.value = object.value ?? "";
2180
2469
  return message;
2181
2470
  },
2182
2471
  };
@@ -2333,6 +2622,439 @@ export const DerivedMetricOutcomeCount: MessageFns<DerivedMetricOutcomeCount> =
2333
2622
  },
2334
2623
  };
2335
2624
 
2625
+ function createBaseListDerivedMetricAttributesRequest(): ListDerivedMetricAttributesRequest {
2626
+ return { organizationId: "", projectId: "" };
2627
+ }
2628
+
2629
+ export const ListDerivedMetricAttributesRequest: MessageFns<ListDerivedMetricAttributesRequest> = {
2630
+ encode(message: ListDerivedMetricAttributesRequest, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
2631
+ if (message.organizationId !== "") {
2632
+ writer.uint32(10).string(message.organizationId);
2633
+ }
2634
+ if (message.projectId !== "") {
2635
+ writer.uint32(18).string(message.projectId);
2636
+ }
2637
+ return writer;
2638
+ },
2639
+
2640
+ decode(input: BinaryReader | Uint8Array, length?: number): ListDerivedMetricAttributesRequest {
2641
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
2642
+ const end = length === undefined ? reader.len : reader.pos + length;
2643
+ const message = createBaseListDerivedMetricAttributesRequest();
2644
+ while (reader.pos < end) {
2645
+ const tag = reader.uint32();
2646
+ switch (tag >>> 3) {
2647
+ case 1: {
2648
+ if (tag !== 10) {
2649
+ break;
2650
+ }
2651
+
2652
+ message.organizationId = reader.string();
2653
+ continue;
2654
+ }
2655
+ case 2: {
2656
+ if (tag !== 18) {
2657
+ break;
2658
+ }
2659
+
2660
+ message.projectId = reader.string();
2661
+ continue;
2662
+ }
2663
+ }
2664
+ if ((tag & 7) === 4 || tag === 0) {
2665
+ break;
2666
+ }
2667
+ reader.skip(tag & 7);
2668
+ }
2669
+ return message;
2670
+ },
2671
+
2672
+ fromJSON(object: any): ListDerivedMetricAttributesRequest {
2673
+ return {
2674
+ organizationId: isSet(object.organizationId)
2675
+ ? globalThis.String(object.organizationId)
2676
+ : isSet(object.organization_id)
2677
+ ? globalThis.String(object.organization_id)
2678
+ : "",
2679
+ projectId: isSet(object.projectId)
2680
+ ? globalThis.String(object.projectId)
2681
+ : isSet(object.project_id)
2682
+ ? globalThis.String(object.project_id)
2683
+ : "",
2684
+ };
2685
+ },
2686
+
2687
+ toJSON(message: ListDerivedMetricAttributesRequest): unknown {
2688
+ const obj: any = {};
2689
+ if (message.organizationId !== "") {
2690
+ obj.organizationId = message.organizationId;
2691
+ }
2692
+ if (message.projectId !== "") {
2693
+ obj.projectId = message.projectId;
2694
+ }
2695
+ return obj;
2696
+ },
2697
+
2698
+ create<I extends Exact<DeepPartial<ListDerivedMetricAttributesRequest>, I>>(
2699
+ base?: I,
2700
+ ): ListDerivedMetricAttributesRequest {
2701
+ return ListDerivedMetricAttributesRequest.fromPartial(base ?? ({} as any));
2702
+ },
2703
+ fromPartial<I extends Exact<DeepPartial<ListDerivedMetricAttributesRequest>, I>>(
2704
+ object: I,
2705
+ ): ListDerivedMetricAttributesRequest {
2706
+ const message = createBaseListDerivedMetricAttributesRequest();
2707
+ message.organizationId = object.organizationId ?? "";
2708
+ message.projectId = object.projectId ?? "";
2709
+ return message;
2710
+ },
2711
+ };
2712
+
2713
+ function createBaseListDerivedMetricAttributesResponse(): ListDerivedMetricAttributesResponse {
2714
+ return {
2715
+ status: undefined,
2716
+ traceAttributes: [],
2717
+ events: [],
2718
+ tracesSampled: 0,
2719
+ tracesSelected: 0,
2720
+ catalogCapped: false,
2721
+ };
2722
+ }
2723
+
2724
+ export const ListDerivedMetricAttributesResponse: MessageFns<ListDerivedMetricAttributesResponse> = {
2725
+ encode(message: ListDerivedMetricAttributesResponse, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
2726
+ if (message.status !== undefined) {
2727
+ ResponseStatus.encode(message.status, writer.uint32(10).fork()).join();
2728
+ }
2729
+ for (const v of message.traceAttributes) {
2730
+ DerivedMetricAttribute.encode(v!, writer.uint32(18).fork()).join();
2731
+ }
2732
+ for (const v of message.events) {
2733
+ DerivedMetricEventAttributes.encode(v!, writer.uint32(26).fork()).join();
2734
+ }
2735
+ if (message.tracesSampled !== 0) {
2736
+ writer.uint32(32).uint32(message.tracesSampled);
2737
+ }
2738
+ if (message.tracesSelected !== 0) {
2739
+ writer.uint32(40).uint32(message.tracesSelected);
2740
+ }
2741
+ if (message.catalogCapped !== false) {
2742
+ writer.uint32(48).bool(message.catalogCapped);
2743
+ }
2744
+ return writer;
2745
+ },
2746
+
2747
+ decode(input: BinaryReader | Uint8Array, length?: number): ListDerivedMetricAttributesResponse {
2748
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
2749
+ const end = length === undefined ? reader.len : reader.pos + length;
2750
+ const message = createBaseListDerivedMetricAttributesResponse();
2751
+ while (reader.pos < end) {
2752
+ const tag = reader.uint32();
2753
+ switch (tag >>> 3) {
2754
+ case 1: {
2755
+ if (tag !== 10) {
2756
+ break;
2757
+ }
2758
+
2759
+ message.status = ResponseStatus.decode(reader, reader.uint32());
2760
+ continue;
2761
+ }
2762
+ case 2: {
2763
+ if (tag !== 18) {
2764
+ break;
2765
+ }
2766
+
2767
+ message.traceAttributes.push(DerivedMetricAttribute.decode(reader, reader.uint32()));
2768
+ continue;
2769
+ }
2770
+ case 3: {
2771
+ if (tag !== 26) {
2772
+ break;
2773
+ }
2774
+
2775
+ message.events.push(DerivedMetricEventAttributes.decode(reader, reader.uint32()));
2776
+ continue;
2777
+ }
2778
+ case 4: {
2779
+ if (tag !== 32) {
2780
+ break;
2781
+ }
2782
+
2783
+ message.tracesSampled = reader.uint32();
2784
+ continue;
2785
+ }
2786
+ case 5: {
2787
+ if (tag !== 40) {
2788
+ break;
2789
+ }
2790
+
2791
+ message.tracesSelected = reader.uint32();
2792
+ continue;
2793
+ }
2794
+ case 6: {
2795
+ if (tag !== 48) {
2796
+ break;
2797
+ }
2798
+
2799
+ message.catalogCapped = reader.bool();
2800
+ continue;
2801
+ }
2802
+ }
2803
+ if ((tag & 7) === 4 || tag === 0) {
2804
+ break;
2805
+ }
2806
+ reader.skip(tag & 7);
2807
+ }
2808
+ return message;
2809
+ },
2810
+
2811
+ fromJSON(object: any): ListDerivedMetricAttributesResponse {
2812
+ return {
2813
+ status: isSet(object.status) ? ResponseStatus.fromJSON(object.status) : undefined,
2814
+ traceAttributes: globalThis.Array.isArray(object?.traceAttributes)
2815
+ ? object.traceAttributes.map((e: any) => DerivedMetricAttribute.fromJSON(e))
2816
+ : globalThis.Array.isArray(object?.trace_attributes)
2817
+ ? object.trace_attributes.map((e: any) => DerivedMetricAttribute.fromJSON(e))
2818
+ : [],
2819
+ events: globalThis.Array.isArray(object?.events)
2820
+ ? object.events.map((e: any) => DerivedMetricEventAttributes.fromJSON(e))
2821
+ : [],
2822
+ tracesSampled: isSet(object.tracesSampled)
2823
+ ? globalThis.Number(object.tracesSampled)
2824
+ : isSet(object.traces_sampled)
2825
+ ? globalThis.Number(object.traces_sampled)
2826
+ : 0,
2827
+ tracesSelected: isSet(object.tracesSelected)
2828
+ ? globalThis.Number(object.tracesSelected)
2829
+ : isSet(object.traces_selected)
2830
+ ? globalThis.Number(object.traces_selected)
2831
+ : 0,
2832
+ catalogCapped: isSet(object.catalogCapped)
2833
+ ? globalThis.Boolean(object.catalogCapped)
2834
+ : isSet(object.catalog_capped)
2835
+ ? globalThis.Boolean(object.catalog_capped)
2836
+ : false,
2837
+ };
2838
+ },
2839
+
2840
+ toJSON(message: ListDerivedMetricAttributesResponse): unknown {
2841
+ const obj: any = {};
2842
+ if (message.status !== undefined) {
2843
+ obj.status = ResponseStatus.toJSON(message.status);
2844
+ }
2845
+ if (message.traceAttributes?.length) {
2846
+ obj.traceAttributes = message.traceAttributes.map((e) => DerivedMetricAttribute.toJSON(e));
2847
+ }
2848
+ if (message.events?.length) {
2849
+ obj.events = message.events.map((e) => DerivedMetricEventAttributes.toJSON(e));
2850
+ }
2851
+ if (message.tracesSampled !== 0) {
2852
+ obj.tracesSampled = Math.round(message.tracesSampled);
2853
+ }
2854
+ if (message.tracesSelected !== 0) {
2855
+ obj.tracesSelected = Math.round(message.tracesSelected);
2856
+ }
2857
+ if (message.catalogCapped !== false) {
2858
+ obj.catalogCapped = message.catalogCapped;
2859
+ }
2860
+ return obj;
2861
+ },
2862
+
2863
+ create<I extends Exact<DeepPartial<ListDerivedMetricAttributesResponse>, I>>(
2864
+ base?: I,
2865
+ ): ListDerivedMetricAttributesResponse {
2866
+ return ListDerivedMetricAttributesResponse.fromPartial(base ?? ({} as any));
2867
+ },
2868
+ fromPartial<I extends Exact<DeepPartial<ListDerivedMetricAttributesResponse>, I>>(
2869
+ object: I,
2870
+ ): ListDerivedMetricAttributesResponse {
2871
+ const message = createBaseListDerivedMetricAttributesResponse();
2872
+ message.status = (object.status !== undefined && object.status !== null)
2873
+ ? ResponseStatus.fromPartial(object.status)
2874
+ : undefined;
2875
+ message.traceAttributes = object.traceAttributes?.map((e) => DerivedMetricAttribute.fromPartial(e)) || [];
2876
+ message.events = object.events?.map((e) => DerivedMetricEventAttributes.fromPartial(e)) || [];
2877
+ message.tracesSampled = object.tracesSampled ?? 0;
2878
+ message.tracesSelected = object.tracesSelected ?? 0;
2879
+ message.catalogCapped = object.catalogCapped ?? false;
2880
+ return message;
2881
+ },
2882
+ };
2883
+
2884
+ function createBaseDerivedMetricAttribute(): DerivedMetricAttribute {
2885
+ return { key: "", type: 0, sampleValues: [] };
2886
+ }
2887
+
2888
+ export const DerivedMetricAttribute: MessageFns<DerivedMetricAttribute> = {
2889
+ encode(message: DerivedMetricAttribute, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
2890
+ if (message.key !== "") {
2891
+ writer.uint32(10).string(message.key);
2892
+ }
2893
+ if (message.type !== 0) {
2894
+ writer.uint32(16).int32(message.type);
2895
+ }
2896
+ for (const v of message.sampleValues) {
2897
+ writer.uint32(26).string(v!);
2898
+ }
2899
+ return writer;
2900
+ },
2901
+
2902
+ decode(input: BinaryReader | Uint8Array, length?: number): DerivedMetricAttribute {
2903
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
2904
+ const end = length === undefined ? reader.len : reader.pos + length;
2905
+ const message = createBaseDerivedMetricAttribute();
2906
+ while (reader.pos < end) {
2907
+ const tag = reader.uint32();
2908
+ switch (tag >>> 3) {
2909
+ case 1: {
2910
+ if (tag !== 10) {
2911
+ break;
2912
+ }
2913
+
2914
+ message.key = reader.string();
2915
+ continue;
2916
+ }
2917
+ case 2: {
2918
+ if (tag !== 16) {
2919
+ break;
2920
+ }
2921
+
2922
+ message.type = reader.int32() as any;
2923
+ continue;
2924
+ }
2925
+ case 3: {
2926
+ if (tag !== 26) {
2927
+ break;
2928
+ }
2929
+
2930
+ message.sampleValues.push(reader.string());
2931
+ continue;
2932
+ }
2933
+ }
2934
+ if ((tag & 7) === 4 || tag === 0) {
2935
+ break;
2936
+ }
2937
+ reader.skip(tag & 7);
2938
+ }
2939
+ return message;
2940
+ },
2941
+
2942
+ fromJSON(object: any): DerivedMetricAttribute {
2943
+ return {
2944
+ key: isSet(object.key) ? globalThis.String(object.key) : "",
2945
+ type: isSet(object.type) ? derivedMetricAttributeTypeFromJSON(object.type) : 0,
2946
+ sampleValues: globalThis.Array.isArray(object?.sampleValues)
2947
+ ? object.sampleValues.map((e: any) => globalThis.String(e))
2948
+ : globalThis.Array.isArray(object?.sample_values)
2949
+ ? object.sample_values.map((e: any) => globalThis.String(e))
2950
+ : [],
2951
+ };
2952
+ },
2953
+
2954
+ toJSON(message: DerivedMetricAttribute): unknown {
2955
+ const obj: any = {};
2956
+ if (message.key !== "") {
2957
+ obj.key = message.key;
2958
+ }
2959
+ if (message.type !== 0) {
2960
+ obj.type = derivedMetricAttributeTypeToJSON(message.type);
2961
+ }
2962
+ if (message.sampleValues?.length) {
2963
+ obj.sampleValues = message.sampleValues;
2964
+ }
2965
+ return obj;
2966
+ },
2967
+
2968
+ create<I extends Exact<DeepPartial<DerivedMetricAttribute>, I>>(base?: I): DerivedMetricAttribute {
2969
+ return DerivedMetricAttribute.fromPartial(base ?? ({} as any));
2970
+ },
2971
+ fromPartial<I extends Exact<DeepPartial<DerivedMetricAttribute>, I>>(object: I): DerivedMetricAttribute {
2972
+ const message = createBaseDerivedMetricAttribute();
2973
+ message.key = object.key ?? "";
2974
+ message.type = object.type ?? 0;
2975
+ message.sampleValues = object.sampleValues?.map((e) => e) || [];
2976
+ return message;
2977
+ },
2978
+ };
2979
+
2980
+ function createBaseDerivedMetricEventAttributes(): DerivedMetricEventAttributes {
2981
+ return { name: "", attributes: [] };
2982
+ }
2983
+
2984
+ export const DerivedMetricEventAttributes: MessageFns<DerivedMetricEventAttributes> = {
2985
+ encode(message: DerivedMetricEventAttributes, writer: BinaryWriter = new BinaryWriter()): BinaryWriter {
2986
+ if (message.name !== "") {
2987
+ writer.uint32(10).string(message.name);
2988
+ }
2989
+ for (const v of message.attributes) {
2990
+ DerivedMetricAttribute.encode(v!, writer.uint32(18).fork()).join();
2991
+ }
2992
+ return writer;
2993
+ },
2994
+
2995
+ decode(input: BinaryReader | Uint8Array, length?: number): DerivedMetricEventAttributes {
2996
+ const reader = input instanceof BinaryReader ? input : new BinaryReader(input);
2997
+ const end = length === undefined ? reader.len : reader.pos + length;
2998
+ const message = createBaseDerivedMetricEventAttributes();
2999
+ while (reader.pos < end) {
3000
+ const tag = reader.uint32();
3001
+ switch (tag >>> 3) {
3002
+ case 1: {
3003
+ if (tag !== 10) {
3004
+ break;
3005
+ }
3006
+
3007
+ message.name = reader.string();
3008
+ continue;
3009
+ }
3010
+ case 2: {
3011
+ if (tag !== 18) {
3012
+ break;
3013
+ }
3014
+
3015
+ message.attributes.push(DerivedMetricAttribute.decode(reader, reader.uint32()));
3016
+ continue;
3017
+ }
3018
+ }
3019
+ if ((tag & 7) === 4 || tag === 0) {
3020
+ break;
3021
+ }
3022
+ reader.skip(tag & 7);
3023
+ }
3024
+ return message;
3025
+ },
3026
+
3027
+ fromJSON(object: any): DerivedMetricEventAttributes {
3028
+ return {
3029
+ name: isSet(object.name) ? globalThis.String(object.name) : "",
3030
+ attributes: globalThis.Array.isArray(object?.attributes)
3031
+ ? object.attributes.map((e: any) => DerivedMetricAttribute.fromJSON(e))
3032
+ : [],
3033
+ };
3034
+ },
3035
+
3036
+ toJSON(message: DerivedMetricEventAttributes): unknown {
3037
+ const obj: any = {};
3038
+ if (message.name !== "") {
3039
+ obj.name = message.name;
3040
+ }
3041
+ if (message.attributes?.length) {
3042
+ obj.attributes = message.attributes.map((e) => DerivedMetricAttribute.toJSON(e));
3043
+ }
3044
+ return obj;
3045
+ },
3046
+
3047
+ create<I extends Exact<DeepPartial<DerivedMetricEventAttributes>, I>>(base?: I): DerivedMetricEventAttributes {
3048
+ return DerivedMetricEventAttributes.fromPartial(base ?? ({} as any));
3049
+ },
3050
+ fromPartial<I extends Exact<DeepPartial<DerivedMetricEventAttributes>, I>>(object: I): DerivedMetricEventAttributes {
3051
+ const message = createBaseDerivedMetricEventAttributes();
3052
+ message.name = object.name ?? "";
3053
+ message.attributes = object.attributes?.map((e) => DerivedMetricAttribute.fromPartial(e)) || [];
3054
+ return message;
3055
+ },
3056
+ };
3057
+
2336
3058
  /**
2337
3059
  * DerivedMetricGatewayService provides web client access to derived metrics: definitions that turn
2338
3060
  * each finished trace into one gauge datapoint. The resulting series is queried through
@@ -2346,6 +3068,14 @@ export interface DerivedMetricGatewayService {
2346
3068
  DeleteDerivedMetric(request: DeleteDerivedMetricRequest, metadata?: Metadata): Promise<DeleteDerivedMetricResponse>;
2347
3069
  /** Evaluates an unsaved program against recent finished traces; persists nothing. */
2348
3070
  DryRunDerivedMetric(request: DryRunDerivedMetricRequest, metadata?: Metadata): Promise<DryRunDerivedMetricResponse>;
3071
+ /**
3072
+ * The authoring catalog: attribute keys, types and sample values observed on recent finished
3073
+ * traces -- trace-level and per-event -- so a builder offers real keys instead of free text.
3074
+ */
3075
+ ListDerivedMetricAttributes(
3076
+ request: ListDerivedMetricAttributesRequest,
3077
+ metadata?: Metadata,
3078
+ ): Promise<ListDerivedMetricAttributesResponse>;
2349
3079
  }
2350
3080
 
2351
3081
  export const DerivedMetricGatewayServiceServiceName = "gateway.web.v1.DerivedMetricGatewayService";
@@ -2361,6 +3091,7 @@ export class DerivedMetricGatewayServiceClientImpl implements DerivedMetricGatew
2361
3091
  this.UpdateDerivedMetric = this.UpdateDerivedMetric.bind(this);
2362
3092
  this.DeleteDerivedMetric = this.DeleteDerivedMetric.bind(this);
2363
3093
  this.DryRunDerivedMetric = this.DryRunDerivedMetric.bind(this);
3094
+ this.ListDerivedMetricAttributes = this.ListDerivedMetricAttributes.bind(this);
2364
3095
  }
2365
3096
  CreateDerivedMetric(request: CreateDerivedMetricRequest, metadata?: Metadata): Promise<CreateDerivedMetricResponse> {
2366
3097
  const data = CreateDerivedMetricRequest.encode(request).finish();
@@ -2397,6 +3128,15 @@ export class DerivedMetricGatewayServiceClientImpl implements DerivedMetricGatew
2397
3128
  const promise = this.rpc.request(this.service, "DryRunDerivedMetric", data, metadata);
2398
3129
  return promise.then((data) => DryRunDerivedMetricResponse.decode(new BinaryReader(data)));
2399
3130
  }
3131
+
3132
+ ListDerivedMetricAttributes(
3133
+ request: ListDerivedMetricAttributesRequest,
3134
+ metadata?: Metadata,
3135
+ ): Promise<ListDerivedMetricAttributesResponse> {
3136
+ const data = ListDerivedMetricAttributesRequest.encode(request).finish();
3137
+ const promise = this.rpc.request(this.service, "ListDerivedMetricAttributes", data, metadata);
3138
+ return promise.then((data) => ListDerivedMetricAttributesResponse.decode(new BinaryReader(data)));
3139
+ }
2400
3140
  }
2401
3141
 
2402
3142
  interface Rpc {
@@ -2437,6 +3177,10 @@ function fromJsonTimestamp(o: any): Date {
2437
3177
  }
2438
3178
  }
2439
3179
 
3180
+ function isObject(value: any): boolean {
3181
+ return typeof value === "object" && value !== null;
3182
+ }
3183
+
2440
3184
  function isSet(value: any): boolean {
2441
3185
  return value !== null && value !== undefined;
2442
3186
  }