- Add full Telegram bot functionality with Z.AI API integration
- Implement 4 tools: Bash, FileEdit, WebSearch, Git
- Add 3 agents: Code Reviewer, Architect, DevOps Engineer
- Add 6 skills for common coding tasks
- Add systemd service file for 24/7 operation
- Add nginx configuration for HTTPS webhook
- Add comprehensive documentation
- Implement WebSocket server for real-time updates
- Add logging system with Winston
- Add environment validation
🤖 zCode CLI X - Agentic coder with Z.AI + Telegram integration
124 lines
5.6 KiB
JavaScript
124 lines
5.6 KiB
JavaScript
/*
|
|
* Copyright The OpenTelemetry Authors
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
import { PatternPredicate } from './Predicate';
|
|
import { createMultiAttributesProcessor, createNoopAttributesProcessor, } from './AttributesProcessor';
|
|
import { InstrumentSelector } from './InstrumentSelector';
|
|
import { MeterSelector } from './MeterSelector';
|
|
import { AggregationType, toAggregation } from './AggregationOption';
|
|
function isSelectorNotProvided(options) {
|
|
return (options.instrumentName == null &&
|
|
options.instrumentType == null &&
|
|
options.instrumentUnit == null &&
|
|
options.meterName == null &&
|
|
options.meterVersion == null &&
|
|
options.meterSchemaUrl == null);
|
|
}
|
|
function validateViewOptions(viewOptions) {
|
|
// If no criteria is provided, the SDK SHOULD treat it as an error.
|
|
// It is recommended that the SDK implementations fail fast.
|
|
if (isSelectorNotProvided(viewOptions)) {
|
|
throw new Error('Cannot create view with no selector arguments supplied');
|
|
}
|
|
// the SDK SHOULD NOT allow Views with a specified name to be declared with instrument selectors that
|
|
// may select more than one instrument (e.g. wild card instrument name) in the same Meter.
|
|
if (viewOptions.name != null &&
|
|
(viewOptions?.instrumentName == null ||
|
|
PatternPredicate.hasWildcard(viewOptions.instrumentName))) {
|
|
throw new Error('Views with a specified name must be declared with an instrument selector that selects at most one instrument per meter.');
|
|
}
|
|
}
|
|
/**
|
|
* Can be passed to a {@link MeterProvider} to select instruments and alter their metric stream.
|
|
*/
|
|
export class View {
|
|
name;
|
|
description;
|
|
aggregation;
|
|
attributesProcessor;
|
|
instrumentSelector;
|
|
meterSelector;
|
|
aggregationCardinalityLimit;
|
|
/**
|
|
* Create a new {@link View} instance.
|
|
*
|
|
* Parameters can be categorized as two types:
|
|
* Instrument selection criteria: Used to describe the instrument(s) this view will be applied to.
|
|
* Will be treated as additive (the Instrument has to meet all the provided criteria to be selected).
|
|
*
|
|
* Metric stream altering: Alter the metric stream of instruments selected by instrument selection criteria.
|
|
*
|
|
* @param viewOptions {@link ViewOptions} for altering the metric stream and instrument selection.
|
|
* @param viewOptions.name
|
|
* Alters the metric stream:
|
|
* This will be used as the name of the metrics stream.
|
|
* If not provided, the original Instrument name will be used.
|
|
* @param viewOptions.description
|
|
* Alters the metric stream:
|
|
* This will be used as the description of the metrics stream.
|
|
* If not provided, the original Instrument description will be used by default.
|
|
* @param viewOptions.attributesProcessors
|
|
* Alters the metric stream:
|
|
* If provided, the attributes will be modified as defined by the added processors.
|
|
* If not provided, all attribute keys will be used by default.
|
|
* @param viewOptions.aggregationCardinalityLimit
|
|
* Alters the metric stream:
|
|
* Sets a limit on the number of unique attribute combinations (cardinality) that can be aggregated.
|
|
* If not provided, the default limit of 2000 will be used.
|
|
* @param viewOptions.aggregation
|
|
* Alters the metric stream:
|
|
* Alters the {@link Aggregation} of the metric stream.
|
|
* @param viewOptions.instrumentName
|
|
* Instrument selection criteria:
|
|
* Original name of the Instrument(s) with wildcard support.
|
|
* @param viewOptions.instrumentType
|
|
* Instrument selection criteria:
|
|
* The original type of the Instrument(s).
|
|
* @param viewOptions.instrumentUnit
|
|
* Instrument selection criteria:
|
|
* The unit of the Instrument(s).
|
|
* @param viewOptions.meterName
|
|
* Instrument selection criteria:
|
|
* The name of the Meter. No wildcard support, name must match the meter exactly.
|
|
* @param viewOptions.meterVersion
|
|
* Instrument selection criteria:
|
|
* The version of the Meter. No wildcard support, version must match exactly.
|
|
* @param viewOptions.meterSchemaUrl
|
|
* Instrument selection criteria:
|
|
* The schema URL of the Meter. No wildcard support, schema URL must match exactly.
|
|
*
|
|
* @example
|
|
* // Create a view that changes the Instrument 'my.instrument' to use to an
|
|
* // ExplicitBucketHistogramAggregation with the boundaries [20, 30, 40]
|
|
* new View({
|
|
* aggregation: new ExplicitBucketHistogramAggregation([20, 30, 40]),
|
|
* instrumentName: 'my.instrument'
|
|
* })
|
|
*/
|
|
constructor(viewOptions) {
|
|
validateViewOptions(viewOptions);
|
|
// Create multi-processor if attributesProcessors are defined.
|
|
if (viewOptions.attributesProcessors != null) {
|
|
this.attributesProcessor = createMultiAttributesProcessor(viewOptions.attributesProcessors);
|
|
}
|
|
else {
|
|
this.attributesProcessor = createNoopAttributesProcessor();
|
|
}
|
|
this.name = viewOptions.name;
|
|
this.description = viewOptions.description;
|
|
this.aggregation = toAggregation(viewOptions.aggregation ?? { type: AggregationType.DEFAULT });
|
|
this.instrumentSelector = new InstrumentSelector({
|
|
name: viewOptions.instrumentName,
|
|
type: viewOptions.instrumentType,
|
|
unit: viewOptions.instrumentUnit,
|
|
});
|
|
this.meterSelector = new MeterSelector({
|
|
name: viewOptions.meterName,
|
|
version: viewOptions.meterVersion,
|
|
schemaUrl: viewOptions.meterSchemaUrl,
|
|
});
|
|
this.aggregationCardinalityLimit = viewOptions.aggregationCardinalityLimit;
|
|
}
|
|
}
|
|
//# sourceMappingURL=View.js.map
|