import { Context } from "../context/types.cjs";
import { AttributeValue, Attributes } from "../common/Attributes.cjs";
//#region src/metrics/Metric.d.ts
/**
 * Advisory options influencing aggregation configuration parameters.
 *
 * @since 1.7.0
 * @experimental
 */
interface MetricAdvice {
  /**
   * Hint the explicit bucket boundaries for SDK if the metric is been
   * aggregated with a HistogramAggregator.
   */
  explicitBucketBoundaries?: number[];
}
/**
 * Options needed for metric creation
 *
 * @since 1.3.0
 */
interface MetricOptions {
  /**
   * The description of the Metric.
   * @default ''
   */
  description?: string;
  /**
   * The unit of the Metric values.
   * @default ''
   */
  unit?: string;
  /**
   * Indicates the type of the recorded value.
   * @default {@link ValueType.DOUBLE}
   */
  valueType?: ValueType;
  /**
   * The advice influencing aggregation configuration parameters.
   * @experimental
   * @since 1.7.0
   */
  advice?: MetricAdvice;
}
/**
 * The Type of value. It describes how the data is reported.
 *
 * @since 1.3.0
 */
declare enum ValueType {
  INT = 0,
  DOUBLE = 1
}
/**
 * Counter is the most common synchronous instrument. This instrument supports
 * an `Add(increment)` function for reporting a sum, and is restricted to
 * non-negative increments. The default aggregation is Sum, as for any additive
 * instrument.
 *
 * Example uses for Counter:
 * <ol>
 *   <li> count the number of bytes received. </li>
 *   <li> count the number of requests completed. </li>
 *   <li> count the number of accounts created. </li>
 *   <li> count the number of checkpoints run. </li>
 *   <li> count the number of 5xx errors. </li>
 * <ol>
 *
 * @since 1.3.0
 */
interface Counter<AttributesTypes extends MetricAttributes = MetricAttributes> {
  /**
   * Increment value of counter by the input. Inputs must not be negative.
   */
  add(value: number, attributes?: AttributesTypes, context?: Context): void;
}
/**
 * @since 1.3.0
 */
interface UpDownCounter<AttributesTypes extends MetricAttributes = MetricAttributes> {
  /**
   * Increment value of counter by the input. Inputs may be negative.
   */
  add(value: number, attributes?: AttributesTypes, context?: Context): void;
}
/**
 * @since 1.9.0
 */
interface Gauge<AttributesTypes extends MetricAttributes = MetricAttributes> {
  /**
   * Records a measurement.
   */
  record(value: number, attributes?: AttributesTypes, context?: Context): void;
}
/**
 * @since 1.3.0
 */
interface Histogram<AttributesTypes extends MetricAttributes = MetricAttributes> {
  /**
   * Records a measurement. Value of the measurement must not be negative.
   */
  record(value: number, attributes?: AttributesTypes, context?: Context): void;
}
/**
 * @deprecated please use {@link Attributes}
 * @since 1.3.0
 */
type MetricAttributes = Attributes;
/**
 * @deprecated please use {@link AttributeValue}
 * @since 1.3.0
 */
type MetricAttributeValue = AttributeValue;
/**
 * Interface that is being used in callback function for Observable Metric.
 *
 * @since 1.3.0
 */
interface ObservableResult<AttributesTypes extends MetricAttributes = MetricAttributes> {
  /**
   * Observe a measurement of the value associated with the given attributes.
   *
   * @param value The value to be observed.
   * @param attributes The attributes associated with the value. If more than
   * one value is associated with the same attributes values, SDK may pick the
   * last one or simply drop the entire observable result.
   */
  observe(this: ObservableResult<AttributesTypes>, value: number, attributes?: AttributesTypes): void;
}
/**
 * Interface that is being used in batch observable callback function.
 *
 * @since 1.3.0
 */
interface BatchObservableResult<AttributesTypes extends MetricAttributes = MetricAttributes> {
  /**
   * Observe a measurement of the value associated with the given attributes.
   *
   * @param metric The observable metric to be observed.
   * @param value The value to be observed.
   * @param attributes The attributes associated with the value. If more than
   * one value is associated with the same attributes values, SDK may pick the
   * last one or simply drop the entire observable result.
   */
  observe(this: BatchObservableResult<AttributesTypes>, metric: Observable<AttributesTypes>, value: number, attributes?: AttributesTypes): void;
}
/**
 * The observable callback for Observable instruments.
 *
 * @since 1.3.0
 */
type ObservableCallback<AttributesTypes extends MetricAttributes = MetricAttributes> = (observableResult: ObservableResult<AttributesTypes>) => void | Promise<void>;
/**
 * The observable callback for a batch of Observable instruments.
 *
 * @since 1.3.0
 */
type BatchObservableCallback<AttributesTypes extends MetricAttributes = MetricAttributes> = (observableResult: BatchObservableResult<AttributesTypes>) => void | Promise<void>;
/**
 * @since 1.3.0
 */
interface Observable<AttributesTypes extends MetricAttributes = MetricAttributes> {
  /**
   * Sets up a function that will be called whenever a metric collection is initiated.
   *
   * If the function is already in the list of callbacks for this Observable, the function is not added a second time.
   */
  addCallback(callback: ObservableCallback<AttributesTypes>): void;
  /**
   * Removes a callback previously registered with {@link Observable.addCallback}.
   */
  removeCallback(callback: ObservableCallback<AttributesTypes>): void;
}
/**
 * @since 1.3.0
 */
type ObservableCounter<AttributesTypes extends MetricAttributes = MetricAttributes> = Observable<AttributesTypes>;
/**
 * @since 1.3.0
 */
type ObservableUpDownCounter<AttributesTypes extends MetricAttributes = MetricAttributes> = Observable<AttributesTypes>;
/**
 * @since 1.3.0
 */
type ObservableGauge<AttributesTypes extends MetricAttributes = MetricAttributes> = Observable<AttributesTypes>;
//#endregion
export { BatchObservableCallback, BatchObservableResult, Counter, Gauge, Histogram, MetricAdvice, MetricAttributeValue, MetricAttributes, MetricOptions, Observable, ObservableCallback, ObservableCounter, ObservableGauge, ObservableResult, ObservableUpDownCounter, UpDownCounter, ValueType };
//# sourceMappingURL=Metric.d.cts.map