Skip to content

v0.155.0

Latest

Choose a tag to compare

@github-actions github-actions released this 24 Jun 13:02
· 18 commits to main since this release
v0.155.0
aaf5045

The OpenTelemetry Collector Contrib contains everything in the opentelemetry-collector release, be sure to check the release notes there as well.

Unmaintained Components

These components are marked as Unmaintained and will eventually be removed from our community distributions. If you depend on these components we need your help to support them.

  • receiver/huaweicloudces

End User Changelog

🛑 Breaking changes 🛑

  • all: Move cmd/schemagen to opentelemetry-collector as go.opentelemetry.io/collector/cmd/schemagen. (#14543)
    The schemagen CLI now lives in the opentelemetry-collector repository. Existing make schemagen and
    make generate-schemas targets continue to work — they now invoke the tool via
    go run go.opentelemetry.io/collector/cmd/schemagen@latest. Override the new SCHEMAGEN_PKG variable
    to pin a specific release. Downstream users that previously imported
    github.com/open-telemetry/opentelemetry-collector-contrib/cmd/schemagen must update their import path
    to go.opentelemetry.io/collector/cmd/schemagen.

  • exporter/signalfx: Stop calculating per-core cpu.* metrics disabled by default. (#49247)
    The default transformations still create aggregate CPU metrics. However, per-core cpu.* metrics which are disabled by default aren't produced by the default transformations anymore.
    To emit equivalent per-core CPU metrics, copy and aggregate system.cpu.time with the transform processor. For example, to emit per-core cpu.idle metrics:

    receivers:
      hostmetrics:
        scrapers:
          cpu:
            metrics:
              system.cpu.time:
                enabled: true
                attributes: [cpu, state]
    processors:
      transform/cpu_idle_per_core:
        error_mode: ignore
        metric_statements:
          - context: metric
            statements:
              - copy_metric(name="cpu.idle") where metric.name == "system.cpu.time"
          - context: datapoint
            statements:
              - set(datapoint.value_double, 0.0) where metric.name == "cpu.idle" and datapoint.attributes["state"] != "idle"
          - context: metric
            statements:
              - aggregate_on_attributes("sum", ["cpu"]) where metric.name == "cpu.idle"
              - scale_metric(100.0) where metric.name == "cpu.idle"
          - context: datapoint
            statements:
              - set(datapoint.value_int, Int(datapoint.value_double)) where metric.name == "cpu.idle"
    service:
      pipelines:
        metrics:
          receivers: [hostmetrics]
          processors: [transform/cpu_idle_per_core]
          exporters: [signalfx]
  • exporter/signalfx: Stop calculating cpu.utilization_per_core disabled by default. (#49243)
    The exporter still creates the aggregate cpu.utilization metric by default. However, cpu.utilization_per_core which is disabled by default isn't produced by the default transformations anymore.
    To emit an equivalent cpu.utilization_per_core metric, enable system.cpu.utilization in the host_metrics receiver, then rename and aggregate it with the transform processor:

    receivers:
      hostmetrics:
        scrapers:
          cpu:
            metrics:
              system.cpu.utilization:
                enabled: true
                attributes: [cpu, state]
    processors:
      transform/cpu_utilization_per_core:
        error_mode: ignore
        metric_statements:
          - context: metric
            statements:
              - set(metric.name, "cpu.utilization_per_core") where metric.name == "system.cpu.utilization"
          - context: datapoint
            statements:
              - set(datapoint.value_double, 0.0) where metric.name == "cpu.utilization_per_core" and datapoint.attributes["state"] == "idle"
          - context: metric
            statements:
              - aggregate_on_attributes("sum", ["cpu"]) where metric.name == "cpu.utilization_per_core"
    service:
      pipelines:
        metrics:
          receivers: [hostmetrics]
          processors: [transform/cpu_utilization_per_core]
          exporters: [signalfx]
  • pkg/fileconsumer: Remove stable gate filelog.decompressFingerprint (#48980)

  • processor/k8s_attributes: Remove deprecated gate k8sattr.labelsAnnotationsSingular.allow (#48977)

  • processor/tail_sampling: Remove stable gate processor.tailsamplingprocessor.disableinvertdecisions (#48976)

  • receiver/datadog: Enhance Datadog logs support (#49102)
    Logs are now translated to the OpenTelemetry data model instead of being emitted as flat string
    attributes: the record timestamp/observed timestamp are set (converting Datadog epoch-milliseconds
    to nanoseconds), status maps to the severity number/text, hostname/service and known ddtags
    are promoted to resource attributes, and dd.trace_id/dd.span_id populate TraceID/SpanID for
    trace correlation (reconstructing full 128-bit trace ids from _dd.p.tid the same way spans do).
    A new logs::decode_json_message option (enabled by default) expands JSON-encoded log messages
    forwarded by the Datadog Agent, lifting their reserved fields and attributes into the log record.

  • receiver/datadog: Enable the receiver.datadogreceiver.Enable128BitTraceID feature gate by default (#49103)
    The gate is promoted from alpha to beta (on by default), so spans reconstruct full 128-bit trace ids
    from _dd.p.tid and emit OpenTelemetry-native trace ids that correlate with other OpenTelemetry
    services. Disable the gate to fall back to 64-bit (zero-padded) trace ids.

  • receiver/mongodb: Minimum supported MongoDB version is now 4.4. (#49248)
    MongoDB 4.0 reached end-of-life in April 2022 and is no longer supported by the Go MongoDB driver v2.7.0+,
    which raised the minimum required wire protocol version. Users still on MongoDB 4.0 must upgrade to at
    least MongoDB 4.4 before upgrading to this version of the receiver.

  • receiver/oracledb: Set db.namespace to database name and add oracle.db.service attribute on query sample and top query events. (#48996)
    On db.server.query_sample and db.server.top_query events, db.namespace
    now reports the database name instead of the Oracle service
    name. The service name moves to the new oracle.db.service attribute.

🚩 Deprecations 🚩

  • connector/service_graph: Deprecate the legacy servicegraph connector latency metric names and millisecond latency unit feature gates, and mark the virtual node feature gate as stable. (#49215)
  • receiver/flink_metrics: Rename receiver type from flinkmetrics to flink_metrics (#45339)
  • receiver/splunk_enterprise: Rename receiver type from splunkenterprise to splunk_enterprise (#45339)

🚀 New components 🚀

  • processor/cardinality_guardian: Promote the cardinalityguardian processor to alpha stability and include it in the contrib distribution. (#47368)
  • receiver/active_directory_inv: Add Windows Active Directory Inventory receiver for collecting inventory data from Active Directory. (#48733)

💡 Enhancements 💡

  • cmd/opampsupervisor: Allow Supervisor to configure its managed OpAMP extension config to include Collector resource attributes (#48536)

  • connector/routing: Add connector.routing.defaultErrorModeIgnore feature gate to change default error_mode from propagate to ignore (#48418)

  • exporter/awsxray: Migrate http.status_code (v1.25.0) semantic convention to http.response.status_code (v1.40.0) (#45058)

  • exporter/awsxray: Migrate container.image.tag (v1.21.0) semantic convention to container.image.tags (v1.40.0) (#45057)

  • exporter/azure_blob: Add support for gzip and zstd compression to the Azure Blob Storage exporter. The compression config option is now supported and the appropriate file extension is added to blob names. (#45338)
    This mirrors the compression support added to the Google Cloud Storage exporter in commit 6fd0eb6. Compression is applied to the marshaled data before upload (including append blocks). Tests and documentation updated.

  • exporter/elasticsearch: Extract span events as separate ECS log documents in ECS mapping mode (#49181)
    In ECS mapping mode, exception span events are routed to logs-apm.error-* and all other
    span events to logs-apm.app.<service>-*, with OTel exception attributes mapped to
    their correct nested ECS paths (error.exception.type, error.exception.message,
    error.stack_trace).

  • exporter/file: Add feature gate for native file-level compression in file exporter (#44077)
    A new alpha feature gate exporter.file.nativeCompression enables native file-level zstd compression.
    When enabled, the exporter produces standard .zst files that can be decompressed with zstd -d,
    unlike the legacy per-message compression format which requires custom tooling.

  • exporter/google_cloud_storage: Add universe_domain config option to support Sovereign Google Cloud regions. Setting this field passes option.WithUniverseDomain to the underlying Google API client. (#48924)

  • exporter/google_cloud_storage: Add resource_attrs_to_gcs to partition objects by a resource attribute value. (#49136)
    When resource_attrs_to_gcs.prefix is set, the value of the given resource attribute
    (read from the first resource of each batch) is inserted as a partition path segment
    between bucket.partition.prefix and the time-based bucket.partition.format, mirroring
    the awss3exporter resource_attrs_to_s3 behavior.

  • exporter/googlecloudpubsub: Add universe_domain config option to support Sovereign Google Cloud regions. Setting this field passes option.WithUniverseDomain to the underlying Google API client. (#48924)

  • exporter/kafka: Add producer.max_broker_write_bytes config (#47492)
    The maximum size of a single write to a broker was previously fixed at the underlying
    franz-go default of 100 MiB and could not be configured. As a result, setting
    producer.max_message_bytes above 100 MiB passed configuration validation but caused the
    collector to fail on startup with an unrecoverable error ("max broker write bytes ... is
    erroneously less than max record batch bytes ...").

    The new producer.max_broker_write_bytes setting (default 104857600, i.e. 100 MiB) exposes
    this limit. To send messages larger than 100 MiB, raise it so it is greater than or equal to
    max_message_bytes. Configuration is now validated up front: the collector reports a clear
    error if max_broker_write_bytes is below the 100 MiB minimum or smaller than
    max_message_bytes, rather than failing at runtime.

  • exporter/load_balancing: Reduce CPU usage and memory allocations when routing traces by traceID (the default routing key) (#48983)
    Routing decisions are unchanged. Spans are now regrouped per backend, so the exact
    ResourceSpans/ScopeSpans grouping of exported traces may differ from the input. If a downstream
    consumer is sensitive to this, a groupbyattrsprocessor on the receiving end can recompact the
    ResourceSpans.

  • exporter/splunk_hec: Support exporting profiles (#48598)

  • extension/azure_encoding: Map schemaVersion and resourceType fields of Azure Storage Blob logs to azure.storage.schema_version and azure.resource.type. (#48753)

  • extension/azure_encoding: Support statusMessage on Administrative Activity Logs (#48932)
    The properties.statusMessage field on Azure Administrative activity logs is now
    parsed. When it contains JSON (the common case for VM ScaleSet operations etc.),
    the structured object is stored under the azure.administrative.status_message
    attribute. Plain-string values are stored as-is.

  • pkg/coreinternal: Migrate messaging.destination (v1.16.0) semantic convention to messaging.destination.name (v1.40.0) (#45077)

  • pkg/coreinternal: Migrate semantic conventions from v1.18.0 to v1.40.0 (#45293)
    Introduced feature gates for the migration of two deprecated semantic conventions:

    • FaaS Execution (faas.execution): Added internal.coreinternal.goldendataset.EmitV1FaaSConventions to opt-in to the new faas.invocation_id attribute.
    • HTTP User Agent (http.user_agent): Added internal.coreinternal.goldendataset.EmitV1HTTPConventions to opt-in to the new user_agent.original attribute.
  • pkg/coreinternal: Improved strptime compatibility for time parsing (#43842)
    Time parsing interfaces (such as the OTTL Time function and the
    timestamp operator) accept strptime-style format strings. This
    PR makes several changes to the parsing logic to better match the
    behavior of strptime. (Most notably, leading zeros are now
    optional for numbers, whitespace is ignored before most elements,
    and more ISO 8601 timezone formats are accepted for %z.)

  • pkg/faro: Migrate deployment.environment (v1.26.0) semantic convention to deployment.environment.name (v1.40.0) (#45074)

  • pkg/ottl: Add stringify_all editor that converts all non-string values in a map to their string representation (#48044)

  • pkg/ottl: Add support for dynamic keys in converters results. (#48834)
    Converter results can now be indexed with dynamic keys expressions that evaluate to a string or integer.
    For example: Split(...)[Len(attributes["items"])] or Split(...)[attributes["index"]].
    Previously, only literal keys (e.g. [0] or ["index"]) were supported.

  • pkg/translator/pprof: Add support for OTel Profiles to pprof conversion across all three message Sample value/timestamp combinations (#48864)

  • pkg/zipkin: Migrated semantic convention from v1.18.0 to v1.40.0 (#45080)

  • processor/coralogix: Add critical path trace annotations. (#48824)
    New critical_path.enabled config computes and writes span attributes cgx.critical_path.is_on_path, cgx.critical_path.exclusive_duration_ns, and cgx.critical_path.inclusive_duration_ns.
    Feature expects complete traces, so groupbytrace should run before coralogixprocessor in the pipeline.
    Example:
    processors: coralogix: critical_path: enabled: true

  • processor/geoip: Add error_mode configuration option to control how geolocation lookup errors are handled. (#35069)
    The error_mode option supports propagate (default, preserves existing behavior),
    ignore (logs the error and continues), and silent (continues without logging).

  • processor/log_dedup: Add metadata_keys and metadata_cardinality_limit options to support multi-tenant pipelines by aggregating logs into separate buckets per unique metadata combination and preserving request context for downstream extensions. (#47521)

  • processor/resource_detection: Add GCP Cloud Run Worker Pool detector to the resource detection processor (#48931)

  • processor/schema: Add support for the Schema v2 file formats (manifest/2.0 and resolved/2.0) defined by OTEP (#48189)
    The processor now auto-detects the schema document format via the file_format
    field and dispatches to a v1.1 or v2 code path accordingly. When the schema URL
    serves a manifest/2.0, the processor follows resolved_registry_uri through
    the existing provider chain (so caching, retry, and storage all apply to both
    fetches) and constructs a single-hop translator from the resolved registry.
    Renames are extracted from deprecated.renamed_to entries in
    attribute_catalog and registry.{metrics,spans,events}. diff/2.0 and
    definition/2 are recognised but not yet supported.

  • processor/spanpruning: Add duration outlier detection, attribute correlation, and outlier preservation to span aggregation (#48984)
    Enabled with enable_outlier_analysis and configured via outlier_analysis.*. Detects slow spans within
    an aggregation group using IQR (default) or MAD, reports attribute values correlated with outliers, and can
    optionally preserve outliers as individual spans instead of aggregating them. Adds the
    processor_spanpruning_outliers_detected, processor_spanpruning_outliers_preserved, and
    processor_spanpruning_outliers_correlations_detected metrics. Behavior is unchanged when disabled.

  • processor/transform: Improve merge_histogram_buckets with method="limit_buckets" to compact buckets closer to the configured limit. (#49020)

  • processor/transformprocessor/internal/logparsingfuncs: Add ParseLEEF function to parse Log Event Extended Format (LEEF) messages. (#44908)

  • processor/transformprocessor/internal/logparsingfuncs: Add ParseCLF function for parsing Common Log Format (CLF) HTTP access log entries. (#48349)
    ParseCLF is available in log statements and returns a map with the parsed
    clf.remote_host, clf.rfc931, clf.auth_user, clf.timestamp, clf.request,
    clf.method, clf.request_uri, clf.protocol, clf.status, and clf.bytes
    fields. An optional format parameter selects between the strict "clf" format
    (default) and the NCSA "combined" format, which additionally parses
    clf.referer and clf.user_agent.

  • receiver/aws_lambda: Introduce Custom Handler support for AWS Lambda Receiver. The custom handler allows the receiver to bind a signal-agnostic extension. (#49160)

  • receiver/awscloudwatch: Adds a new configuration option initial_lookback to the AWS CloudWatch Logs receiver for specifying how far back from the collector's startup time to begin collecting logs. (#47754)

  • receiver/azure_event_hub: Add the ability to use encoding extensions to the Azure Event Hub receiver. (#48753)

  • receiver/datadog: Support zstd-compressed request payloads (#49101)
    Recent Datadog Agents (7.59+) zstd-compress HTTP payloads by default. The receiver now decompresses
    both gzip and zstd request bodies.

  • receiver/datadog: Add feature gate to stop emitting deprecated rpc.service attribute (#22095)
    The feature gate receiver.datadogreceiver.DontEmitDeprecatedRPCServiceAttr
    (disabled by default) allows users to opt out of the deprecated rpc.service
    attribute on gRPC spans. The service name is already captured in the span
    name (service/method) and rpc.method attribute.

  • receiver/file_log: Improve polling performance when watching many files by indexing fingerprint matching. (#27404)

  • receiver/googlecloudmonitoring: Add universe_domain config option to support Sovereign Google Cloud regions. Setting this field passes option.WithUniverseDomain to the underlying Google API client. (#48924)

  • receiver/googlecloudpubsub: Add universe_domain config option to support Sovereign Google Cloud regions. Setting this field passes option.WithUniverseDomain to the underlying Google API client. (#48924)

  • receiver/host_metrics: Enable the Android platform in the process scraper. (#47296)

  • receiver/host_metrics: Add AIX-specific process scraper implementation. (#47095)
    Implements AIX versions of the platform-specific process scraper hooks
    (CPU time/utilization recording, process name, executable, and command
    extraction), replacing the previous empty stubs that the "others"
    fallback provided.

  • receiver/oracledb: Enhance SQL obfuscation to anonymize comments while preserving query structure (#48508)

    • Query structure, formatting, and whitespace are now preserved during obfuscation for improved readability.
  • receiver/oracledb: Add additional attributes to the Oracle query execution plan. (#48965)
    Extend the execution plan with five additional attributes:

    • OBJECT_NAME: Name of the object referenced by the plan step
    • OBJECT_TYPE: Type of the referenced object (e.g., table, index)
    • FILTER_PREDICATES: Predicates applied as a filter during the step
    • PARTITION_START: Starting partition for partitioned access
    • PARTITION_STOP: Ending partition for partitioned access
  • receiver/oracledb: Add oracledb.plan.first_load attribute to the db.server.top_query event (#48998)

  • receiver/oracledb: Add SQL comment extraction support. Users can now configure allowed_comment_keys to extract key-value pairs from leading SQL block comments and include them as the db.query.comment_tags telemetry attribute. (#48338)

  • receiver/prometheus: Add scrape_on_shutdown, discovery_reload_on_startup, and initial_scrape_offset configuration options to allow tuning startup and shutdown scrape behavior in serverless environments. (#48979)

    • scrape_on_shutdown (default: false): Enables a final scrape before the receiver closes.
    • discovery_reload_on_startup (default: false): Enables discovering targets immediately on startup.
    • initial_scrape_offset (default: 0s): Adds a fixed delay before the initial scrape of targets.
  • receiver/sqlserver: Add sqlserver.query.plan.creation_time attribute to the db.server.top_query event. (#49018)

  • receiver/sqlserver: Add service.name and service.namespace opt-in resource attributes and allow overriding any resource attribute via override_value. (#46176)
    When service.name is enabled, the receiver sets it to unknown_service:microsoft.sql_server per OTel specification.
    When service.namespace is enabled, it defaults to an empty string until set via configuration.
    Each resource attribute now accepts an override_value under resource_attributes, letting users pin
    values such as service.name, service.namespace, or service.instance.id to uniquely identify
    database instances across environments.

🧰 Bug fixes 🧰

  • cmd/opampsupervisor: Normalize merged service.telemetry.resource settings so mixed legacy inline attributes and declarative attributes entries do not produce invalid effective Collector configs (#48365)

  • connector/failover: Stop the connector's wrapped exporterhelper from imposing its default 5s timeout on the downstream pipeline when sending_queue is enabled. (#48567)
    Previously, enabling sending_queue caused the connector to wrap itself in exporterhelper.NewLogs/Traces/Metrics, which silently installs a timeoutSender with the 5s default TimeoutConfig.Timeout. That deadline propagated through to downstream exporters via ctx.Deadline(), capping their configured timeouts (e.g., a downstream exporter configured with timeout: 30s would only see ~5s of budget at its pushLogsData). The connector now passes WithTimeout(TimeoutConfig{Timeout: 0}) explicitly, matching the pattern used by signalfxexporter and splunkhecexporter. A user-facing timeout config field on the connector may be added separately if there is demand for connector-level hang-protection.

  • exporter/elasticsearch: Skip error.grouping_name when encoding ECS span events, as it is a scripted field in the logs-apm.error index template and cannot be indexed directly. (#49216)

  • exporter/load_balancing: Fix Kubernetes resolver initialization to allow exporter creation outside k8s cluster by deferring client creation to start time (#42293)

  • exporter/load_balancing: Fix a wait-group leak on the trace routing path that could cause Shutdown to hang when backend resolution fails partway through a batch (#48983)

  • extension/datadog: Fix tls.insecure_skip_verify being ignored (#48992)

  • extension/google_cloud_logentry_encoding: Accept short ALPN protocol tokens (e.g. h2, h3) in httpRequest.protocol that do not contain a /; previously any protocol string without a slash was rejected with an error, causing log entries from Google Cloud Load Balancers that switched to reporting h2 for HTTP/2 to be silently dropped. (#45214)

  • pkg/ottl: Fix replace_pattern and replace_all_patterns using a Function argument so each match is replaced only at its position, instead of everywhere the matched text appears. (#48437)

  • pkg/stanza: Fix stanza container operator logging errors at ERROR level when on_error is set to a quiet mode (#42646)
    Previously, the container operator logged entry-level processing errors at
    ERROR level even when on_error was set to drop_quiet or send_quiet.
    These errors are now logged at DEBUG level in quiet modes, matching the
    documented behavior. Downstream delivery failures continue to propagate so
    the pipeline can react to them.

  • pkg/translator/pprof: Fix the wrong timestamp conversion. (#48813)

  • processor/k8s_attributes: Prevent unbounded memory growth by cleaning up stale pod identifiers, including container.id entries left behind after container restarts (#48398)

  • processor/metrics_transform: Add required-field validation for combine action: return an error if new_name or aggregation_type is missing, preventing silent data loss and empty metric names. (#48871)

  • processor/redaction: Fix a panic in database attribute sanitization when traces are processed concurrently. (#49048)

  • processor/transform: Fix transform processor config unmarshaling to return an error for empty statement list items instead of panicking. (#49245)

  • receiver/azure_monitor: Fix discovery and collection of custom metric namespace definitions (e.g. azure.vm.linux.guestmetrics published by Azure Monitor Agent / MetricsExtension) (#40989)
    The MetricDefinitions API only returns custom namespace metrics when the metricnamespace query parameter is explicitly set. Previously, metrics configured under receiver::metrics for a custom namespace were silently dropped because the API call used no filter and only returned the resource's default namespace. The receiver now makes an additional namespace-filtered call for each custom namespace in the metrics config that was not returned by the default call.

  • receiver/datadog: Fix StartTimestamp exceeding Timestamp on delta-temporality data points when out-of-order or late-arriving submissions are received. (#48449)
    The datadog receiver now guards StartTimestamp assignment to enforce the OTel data model
    invariant (StartTimestamp <= Timestamp) for delta-temporality metrics. Late-arriving or
    out-of-order data points no longer poison the stored timestamp for subsequent submissions.

  • receiver/http_check: Stop emitting two httpcheck.tls.cert_remaining data points per scrape (#47740)

  • receiver/kafka_metrics: use kadm.Client.Lag and do not record negative values (#48701)

  • receiver/oracledb: Clamp negative DURATION_SEC and SESSION_DURATION_SEC values in the query sample to zero. (#48901)
    Fix negative duration values in query sample metrics by clamping DURATION_SEC and SESSION_DURATION_SEC to zero minimum.

  • receiver/purefa: Fix the receiver failing to start due to an invalid internal Prometheus scrape configuration. (#48847)
    The receiver used a *discovery.StaticConfig pointer when building the Prometheus scrape
    configs. Only the value type discovery.StaticConfig is registered for YAML marshaling, so
    the prometheus receiver failed on startup with "cannot marshal unregistered Config type:
    *discovery.StaticConfig". The config now uses the value type.

  • receiver/purefb: Fix the receiver failing to start due to an invalid internal Prometheus scrape configuration. (#48851)
    The receiver used a *discovery.StaticConfig pointer when building the Prometheus scrape
    configs. Only the value type discovery.StaticConfig is registered for YAML marshaling, so
    the prometheus receiver failed on startup with "cannot marshal unregistered Config type:
    *discovery.StaticConfig". The config now uses the value type.

  • receiver/statsd: Clean up stale unix socket file on startup to prevent "address already in use" errors after unclean shutdown. (#44866)

  • receiver/statsd: Skip empty tag entries instead of aborting the tag parse loop, so valid tags after an empty entry are no longer dropped. (#48483)
    Previously, tags containing an empty entry (e.g. from consecutive commas like |#,,key:value) caused the
    parser to exit the loop on the first empty entry, silently dropping all subsequent valid tags. Empty entries
    are now skipped, matching the permissive behavior of the Datadog agent.

API Changelog

💡 Enhancements 💡

  • pkg/ottl: Add ottl.LambdaExpression API so OTTL functions can support Lambda expressions as arguments (#48227)
  • pkg/pdatatest: Add pmetricassert histogram datapoint assertions (#48473)
  • pkg/pdatatest: Add duplicate ScopeMetrics check to ValidateMetrics (#48106)

🧰 Bug fixes 🧰

  • pkg/pdatatest: Keep pmetricassert normalization from returning validation errors for duplicate datapoints (#48775)

We are thrilled to welcome our first-time contributors to this project. Thank you for your contributions @vishalmore90, @amarkdotdev, @shachar-ash, @wehzzz, @Zapulin, @truthbk, @rajnish-jais, @singhvishalkr, @imankurpatel000, @hush-hush, @tank-500m, @shubham-sumo, @velom, @mangod12, @agagniere, @tharunn0 ! 🎉