Skip to content

enhancement(tag_cardinality_limit transform): Add more fine grained controls tag cardinality#25360

Open
ArunPiduguDD wants to merge 1 commit intoarun.pidugu/tag-cardinality-tracking-scopefrom
arun.pidugu/add-more-fine-grained-controls-tag-cardinality
Open

enhancement(tag_cardinality_limit transform): Add more fine grained controls tag cardinality#25360
ArunPiduguDD wants to merge 1 commit intoarun.pidugu/tag-cardinality-tracking-scopefrom
arun.pidugu/add-more-fine-grained-controls-tag-cardinality

Conversation

@ArunPiduguDD
Copy link
Copy Markdown
Contributor

@ArunPiduguDD ArunPiduguDD commented May 4, 2026

Summary

Adds additional fine-grained controls for the tag cardinality processor, allowing users to

(1) Add per tag limits within each metric
(2) Add the ability to exclude a specific metric or tag from tracking (if the metric is excluded the tag will be too regardless of any per tag config)

Each tag has it's own config in which the following fields can be configured
(1) Tracking mode - Added a new exclude mode for inner overrides
(2) The value limit

This is based off of the changes in #25372

Vector configuration

sources:
  otel:
    type: opentelemetry
    grpc:
      address: "0.0.0.0:4317"
    http:
      address: "0.0.0.0:4318"

transforms:
  cardinality:
    type: tag_cardinality_limit
    inputs: ["otel.metrics"]
    value_limit: 8
    mode: exact
    limit_exceeded_action: drop_event
    tracking_scope: per_metric

    per_metric_limits:
      # metric exclusion — all tags pass through, nothing tracked
      system.process.count:
        mode: excluded

      # metric override with drop_event and per-tag rules
      demo_value_gauge:
        value_limit: 10
        mode: exact
        limit_exceeded_action: drop_event
        per_tag_limits:
          # tag exclusion — trace_id is high-cardinality, skip tracking entirely
          trace_id:
            mode: excluded
          # tag override — tighter cap for this tag
          environment:
            value_limit: 3
            mode: exact

      # same tags as demo_value_gauge but drop_tag action for comparison
      demo_value_counter:
        value_limit: 10
        mode: exact
        limit_exceeded_action: drop_tag
        per_tag_limits:
          trace_id:
            mode: excluded
          environment:
            value_limit: 3
            mode: exact

sinks:
  console:
    type: console
    inputs: ["cardinality"]
    encoding:
      codec: json

How did you test this PR?

Regression test run: https://github.com/vectordotdev/vector/actions/runs/25386735971

Unit tests + used the test config above. Simulated an Otel collector source with the following Python script:

import random
import string
from uuid import uuid4

from opentelemetry import metrics
from opentelemetry.metrics import Observation
from opentelemetry.exporter.otlp.proto.http.metric_exporter import OTLPMetricExporter
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import InMemoryMetricReader, MetricExportResult
from opentelemetry.sdk.metrics.view import View, DropAggregation
from opentelemetry.sdk.resources import Resource


VECTOR_METRICS_ENDPOINT = "http://localhost:4318/v1/metrics"


def rand_token(prefix: str, n: int = 8) -> str:
    return f"{prefix}-{''.join(random.choices(string.ascii_lowercase + string.digits, k=n))}"


def random_trace_id() -> str:
    return uuid4().hex + uuid4().hex


def random_environment() -> str:
    return rand_token(random.choice(["dev", "staging", "prod", "local", "qa"]))


def build_common_tags() -> dict[str, str]:
    return {
        "trace_id": random_trace_id(),
        "environment": random_environment(),
    }


def build_system_process_tags() -> dict[str, str]:
    tags = build_common_tags()
    tags.update(
        {
            "host_id": rand_token("host"),
            "process_group": rand_token("pg"),
            "shard": rand_token("shard"),
            "worker": rand_token("worker"),
        }
    )
    return tags


def main() -> None:
    resource = Resource.create(
        {
            "service.name": "vector-http-metrics-demo",
            "service.version": "1.0.0",
        }
    )

    reader = InMemoryMetricReader()

    provider = MeterProvider(
        resource=resource,
        metric_readers=[reader],
        views=[
            View(instrument_name="*", aggregation=DropAggregation()),
            View(instrument_name="demo_value_gauge"),
            View(instrument_name="system.process.count"),
            View(instrument_name="demo_value_counter"),
            View(instrument_name="demo_value_secondary_gauge"),
            View(instrument_name="demo_value_secondary_counter"),
        ],
    )
    metrics.set_meter_provider(provider)

    exporter = OTLPMetricExporter(
        endpoint=VECTOR_METRICS_ENDPOINT,
        timeout=3000,
    )

    meter = metrics.get_meter("demo-meter")

    state = {
        "demo_value_gauge": {
            "value": 0.0,
            "tags": build_common_tags(),
        },
        "system.process.count": {
            "value": 0.0,
            "tags": build_system_process_tags(),
        },
        "demo_value_counter": {
            "value": 0.0,
            "tags": build_common_tags(),
        },
        "demo_value_secondary_gauge": {
            "value": 0.0,
            "tags": build_common_tags(),
        },
        "demo_value_secondary_counter": {
            "value": 0.0,
            "tags": build_common_tags(),
        },
    }

    def demo_value_gauge_callback(_options):
        s = state["demo_value_gauge"]
        return [Observation(s["value"], s["tags"])]

    def system_process_count_callback(_options):
        s = state["system.process.count"]
        return [Observation(s["value"], s["tags"])]

    def demo_value_counter_callback(_options):
        s = state["demo_value_counter"]
        return [Observation(s["value"], s["tags"])]

    def demo_value_secondary_gauge_callback(_options):
        s = state["demo_value_secondary_gauge"]
        return [Observation(s["value"], s["tags"])]

    def demo_value_secondary_counter_callback(_options):
        s = state["demo_value_secondary_counter"]
        return [Observation(s["value"], s["tags"])]

    meter.create_observable_gauge(
        name="demo_value_gauge",
        callbacks=[demo_value_gauge_callback],
        description="Gauge metric exported to Vector over OTLP/HTTP",
        unit="1",
    )

    meter.create_observable_gauge(
        name="system.process.count",
        callbacks=[system_process_count_callback],
        description="Process count metric exported to Vector over OTLP/HTTP",
        unit="1",
    )

    meter.create_observable_counter(
        name="demo_value_counter",
        callbacks=[demo_value_counter_callback],
        description="Counter metric exported to Vector over OTLP/HTTP",
        unit="1",
    )

    meter.create_observable_gauge(
        name="demo_value_secondary_gauge",
        callbacks=[demo_value_secondary_gauge_callback],
        description="Second demo gauge metric exported to Vector over OTLP/HTTP",
        unit="1",
    )

    meter.create_observable_counter(
        name="demo_value_secondary_counter",
        callbacks=[demo_value_secondary_counter_callback],
        description="Second demo counter metric exported to Vector over OTLP/HTTP",
        unit="1",
    )

    print(f"Configured OTLP/HTTP metrics endpoint: {VECTOR_METRICS_ENDPOINT}")
    print("Press Enter to send all five metrics with random values and random tags.")
    print("Type q and press Enter to quit.")

    try:
        while True:
            user_input = input("> ").strip().lower()
            if user_input in {"q", "quit", "exit"}:
                break

            state["demo_value_gauge"]["value"] = round(random.uniform(0, 100), 2)
            state["system.process.count"]["value"] = float(random.randint(1, 500))
            state["demo_value_counter"]["value"] += float(random.randint(1, 20))
            state["demo_value_secondary_gauge"]["value"] = round(random.uniform(-50, 50), 2)
            state["demo_value_secondary_counter"]["value"] += float(random.randint(1, 10))

            state["demo_value_gauge"]["tags"] = build_common_tags()
            state["system.process.count"]["tags"] = build_system_process_tags()
            state["demo_value_counter"]["tags"] = build_common_tags()
            state["demo_value_secondary_gauge"]["tags"] = build_common_tags()
            state["demo_value_secondary_counter"]["tags"] = build_common_tags()

            metrics_data = reader.get_metrics_data()
            if metrics_data is None:
                print("send failed: no metrics data collected")
                continue

            result = exporter.export(metrics_data)

            if result is MetricExportResult.SUCCESS:
                print("sent all metrics")
                print(
                    f"  demo_value_gauge value={state['demo_value_gauge']['value']} "
                    f"tags={state['demo_value_gauge']['tags']}"
                )
                print(
                    f"  system.process.count value={state['system.process.count']['value']} "
                    f"tags={state['system.process.count']['tags']}"
                )
                print(
                    f"  demo_value_counter value={state['demo_value_counter']['value']} "
                    f"tags={state['demo_value_counter']['tags']}"
                )
                print(
                    f"  demo_value_secondary_gauge value={state['demo_value_secondary_gauge']['value']} "
                    f"tags={state['demo_value_secondary_gauge']['tags']}"
                )
                print(
                    f"  demo_value_secondary_counter value={state['demo_value_secondary_counter']['value']} "
                    f"tags={state['demo_value_secondary_counter']['tags']}"
                )
            else:
                print("send failed for this export batch")

    finally:
        exporter.shutdown()
        provider.shutdown()


if __name__ == "__main__":
    main()

Change Type

  • Bug fix
  • New feature
  • Dependencies
  • Non-functional (chore, refactoring, docs)
  • Performance

Is this a breaking change?

  • Yes
  • No

Does this PR include user facing changes?

  • Yes. Please add a changelog fragment based on our guidelines.
  • No. A maintainer will apply the no-changelog label to this PR.

References

Notes

  • Please read our Vector contributor resources.
  • Do not hesitate to use @vectordotdev/vector to reach out to us regarding this PR.
  • Some CI checks run only after we manually approve them.
    • We recommend adding a pre-push hook, please see this template.
    • Alternatively, we recommend running the following locally before pushing to the remote branch:
      • make fmt
      • make check-clippy (if there are failures it's possible some of them can be fixed with make clippy-fix)
      • make test
  • After a review is requested, please avoid force pushes to help us review incrementally.
    • Feel free to push as many commits as you want. They will be squashed into one before merging.
    • For example, you can run git merge origin master and git push.
  • If this PR introduces changes Vector dependencies (modifies Cargo.lock), please
    run make build-licenses to regenerate the license inventory and commit the changes (if any). More details on the dd-rust-license-tool.

@github-actions github-actions Bot added docs review on hold The documentation team reviews PRs only after a PR is approved by the COSE team. domain: transforms Anything related to Vector's transform components domain: external docs Anything related to Vector's external, public documentation domain: core Anything related to core crates i.e. vector-core, core-common, etc labels May 4, 2026
@kaarolch
Copy link
Copy Markdown
Contributor

kaarolch commented May 4, 2026

btw. Do you have any use case why include metrics exclusion to cardinality_tags would be better compare to current possible solution: route + remap which should be more sufficient instead scan cardinality list?

#name: metrics_route_cardinality_limi
type: route
inputs:
  - vector_ingress
route:
  cardinality_bypass: .tags.cardinality_bypass == "true"
...  
type: tag_cardinality_limit
inputs:
  - metrics_route_cardinality_limit._unmatched
.....

If you connect it with enrichment table you can manage metrics from external csv.

:FYI another PR for tags exclusion: #25316.

@ArunPiduguDD ArunPiduguDD changed the title enhancement(Tags Cardinality): Add more fine grained controls tag cardinality enhancement(tag_cardinality_limit transform): Add more fine grained controls tag cardinality May 4, 2026
@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch from df32f77 to f64d3bb Compare May 4, 2026 20:32
@github-actions github-actions Bot removed the domain: core Anything related to core crates i.e. vector-core, core-common, etc label May 4, 2026
@ArunPiduguDD
Copy link
Copy Markdown
Contributor Author

@kaarolch This would be if you wanted to different limits for tags in a metric (or if only one tag on a metric should be excluded from the limit)

@ArunPiduguDD
Copy link
Copy Markdown
Contributor Author

Took a look at your PR, if we add support for per tag limits I wonder if exclude_tags might be integrated with this approach

@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch 7 times, most recently from f4ca43a to 94f0198 Compare May 5, 2026 17:21
@ArunPiduguDD ArunPiduguDD changed the base branch from master to arun.pidugu/tag-cardinality-tracking-scope May 5, 2026 17:25
@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/tag-cardinality-tracking-scope branch from 8044081 to 9a136f2 Compare May 5, 2026 19:03
@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch from 94f0198 to 8fe11cd Compare May 5, 2026 19:03
@ArunPiduguDD ArunPiduguDD marked this pull request as ready for review May 5, 2026 19:22
@ArunPiduguDD ArunPiduguDD requested review from a team as code owners May 5, 2026 19:22
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8fe11cd4dc

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/transforms/tag_cardinality_limit/mod.rs
@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch from 8fe11cd to 261b894 Compare May 5, 2026 19:48
@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch from 261b894 to 93cf811 Compare May 7, 2026 19:57
@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/tag-cardinality-tracking-scope branch from 9a136f2 to b402066 Compare May 7, 2026 19:57
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 93cf811cf2

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +123 to +126
value_limit: per_tag
.config
.value_limit
.unwrap_or(per_metric.config.value_limit),
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Honor global value_limit when per-metric limit is unset

When a per_metric_limits entry exists only to set mode/per_tag_limits and omits value_limit, serde still fills per_metric.config.value_limit with the default 500, so a per-tag entry that also omits value_limit inherits 500 here instead of the configured global limit. After the prior Option fix, this still affects configs like global value_limit: 10 plus per_metric_limits.metricA.mode: exact and per_tag_limits.tag1.mode: exact, silently widening that tag to 500 values despite the documented per-tag → per-metric → global resolution.

Useful? React with 👍 / 👎.

@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/tag-cardinality-tracking-scope branch from b402066 to 445abd6 Compare May 8, 2026 02:33
@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch from 93cf811 to 8130348 Compare May 8, 2026 02:33
Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 813034873c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +136 to +137
#[serde(flatten)]
pub mode: OverrideMode,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Allow per-tag entries to inherit mode

When a per_tag_limits entry is intended to override only value_limit (for example per_tag_limits.user_id.value_limit: 10 under an exact per-metric/global config), deserialization still requires a mode here because OverrideMode is non-optional and has no default. That makes value-limit-only per-tag overrides fail to load instead of following the documented per-field resolution order where mode can fall back to the enclosing per-metric/global setting.

Useful? React with 👍 / 👎.

@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch from 8130348 to b8f4022 Compare May 8, 2026 03:12
@ArunPiduguDD
Copy link
Copy Markdown
Contributor Author

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: b8f4022c5a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +170 to +172
mode: {
description: "Controls the approach taken for tracking tag cardinality."
required: true
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Mark per-tag mode as optional in generated docs

For per-tag entries that only override value_limit, the runtime explicitly supports omitting mode (see the new deserialization test and PerTagInner.mode: Option<OverrideMode>), but the generated reference still marks this field as required. Users following or validating against this generated configuration docs will reject supported configs such as per_tag_limits: { env: { value_limit: 3 } }, which the changelog advertises as valid inherited behavior.

Useful? React with 👍 / 👎.

@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch from b8f4022 to 5501c78 Compare May 8, 2026 03:48
@ArunPiduguDD
Copy link
Copy Markdown
Contributor Author

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 5501c78dc4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

.unwrap_or(&self.config.global),
None => &self.config.global,
{
return pmc.config.limit_exceeded_action;
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Inherit the global action when no metric action is set

In configs that set limit_exceeded_action: drop_event globally and add a per_metric_limits entry only to define per_tag_limits, omitting limit_exceeded_action on that metric deserializes to the DropTag default and this branch returns it instead of the global action. That makes the metric drop individual tags rather than the whole event, contrary to the documented per-tag inheritance path; the per-metric action needs to be optional or otherwise distinguish omitted from explicitly set.

Useful? React with 👍 / 👎.

cache_size_per_key: cache_size,
})
}
None => metric_mode,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Honor per-tag cache overrides when inheriting mode

When a per-tag entry sets only cache_size_per_key under an enclosing mode: probabilistic metric, mode is None here and the code returns the per-metric metric_mode unchanged, so the tag-specific cache size is silently ignored. This affects users who omit mode to inherit probabilistic tracking while tuning the tag's Bloom filter size, which the new config comments and schema allow.

Useful? React with 👍 / 👎.

@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch from 5501c78 to 6dd63ac Compare May 8, 2026 04:03
@ArunPiduguDD
Copy link
Copy Markdown
Contributor Author

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6dd63acf61

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

value_limit: per_tag.config.value_limit.unwrap_or(metric_value_limit),
limit_exceeded_action,
mode,
internal_metrics: per_metric.config.internal_metrics,
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Inherit global internal metric tags for per-metric overrides

When internal_metrics.include_extended_tags is enabled globally and a per_metric_limits entry only overrides limits/mode or adds per_tag_limits, this always uses the per-metric struct's serde default (false) instead of the global setting. That makes rejection counters for those metrics lose the metric_name/tag_key labels despite the new inheritance path documenting per-tag/per-metric/global resolution; make this field optional or merge it with self.config.global.internal_metrics before returning the resolved settings.

Useful? React with 👍 / 👎.

@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch from 6dd63ac to 8519e7c Compare May 8, 2026 04:17
@ArunPiduguDD
Copy link
Copy Markdown
Contributor Author

@codex review

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 8519e7cd21

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +136 to +138
#[configurable_component]
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub struct PerTagInner {
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Reject unknown per-tag override fields

When users configure per_tag_limits, this new struct accepts unknown keys by default, so a typo such as value_limt: 2 or an unsupported per-tag limit_exceeded_action is silently ignored and the tag inherits the enclosing settings instead. That can leave high-cardinality tags effectively less restricted than the operator intended; add deny_unknown_fields or equivalent validation for the per-tag override object.

Useful? React with 👍 / 👎.

@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch from 8519e7c to 3d11e7d Compare May 8, 2026 04:35
@ArunPiduguDD ArunPiduguDD force-pushed the arun.pidugu/add-more-fine-grained-controls-tag-cardinality branch from 3d11e7d to 9c68670 Compare May 8, 2026 05:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

docs review on hold The documentation team reviews PRs only after a PR is approved by the COSE team. domain: external docs Anything related to Vector's external, public documentation domain: transforms Anything related to Vector's transform components

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants