Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[CONTP-388] use entityid struct in tagger component #30133

Merged

Conversation

adel121
Copy link
Contributor

@adel121 adel121 commented Oct 15, 2024

What does this PR do?

This PR changes the signature of the Tag method of the tagger interface to receive the entity id as a struct instead of a string.

Motivation

TL:DR; Avoid string manipulation overhead.

Full context:
Entity ID is composed of a prefix and an id and is displayed as {prefix}://{id}.
Callers of the tagger usually have the prefix and the id parts separated, and they form the entityID as a string by concatenating the prefix and id along with the separator: fmt.Sprintf("%s://%s", prefix, id).
This entityID is passed as a string to the tagger Tag method to get the entity tags.
However, the tagger needs to separate the prefix and the id, so it will need to parse the string, adding an overhead.

To eliminate this overhead, with the change introduced in this PR, the entityID will now be passed as a struct containing 2 fields, one for the prefix and one for the id, eliminating the need to perform string manipulations (concatenations and splits).

Describe how to test/QA your changes

Unit tests and E2E tests should cover most the QA.

However, we still need to verify that python integrations can still query the tagger normally.

Here is a sample QA:

Deploy the agent with helm.

Do the following steps to deploy a custom python check onto the agent:

  1. Check the running pods:
kubectl get pods
NAME                                         READY   STATUS    RESTARTS      AGE
datadog-agent-cluster-agent-cfc87c6c-d26pg   1/1     Running   0             107m
datadog-agent-hsstl                          3/3     Running   4 (73m ago)   107m
  1. Check the content of the tagger, and pick any tag entity id for testing:
kubectl exec datadog-agent-hsstl -- agent tagger-list
....
=== Entity kubernetes_pod_uid://b97232df7635c1e88c7bd9309b8e78ae ===
== Source workloadmeta-kubernetes_pod =
=Tags: [kube_namespace:kube-system kube_priority_class:system-node-critical kube_qos:Burstable pod_name:kube-apiserver-kind-control-plane pod_phase:running]
===
....
  1. Exec into the agent container: kubectl exec -it datadog-agent-hsstl -c agent -- bin/bash
  2. Add a file called custom_checkvalue.yaml under etc/datadog-agent/conf.d with the following content:
init_config:
instances:
  [{}]
  1. Add the check code in a file called custom_checkvalue.py under etc/datadog-agent/checks.d with the following content:
from datadog_checks.base.utils.tagging import tagger
from checks import AgentCheck
class HelloCheck(AgentCheck):
  def check(self, instance):
    tags = tagger.tag('kubernetes_pod_uid://b97232df7635c1e88c7bd9309b8e78ae', tagger.HIGH)
    print("obtained tags: ", tags)
    self.gauge('hello.world', 1, tags)

ATTENTION: you should use the entity id that you go from the tagger-list command in step 2.

  1. Restart the agent by running: agent stop && agent start

Wait for the agent to start, and run the custom check as follows:

 kubectl exec datadog-agent-hsstl -- agent check custom_checkvalue > output.txt

....
=== Series ===
[
  {
    "metric": "hello.world",
    "points": [
      [
        1728996360,
        1
      ]
    ],
    "tags": [
      "kube_namespace:kube-system",
      "kube_priority_class:system-node-critical",
      "kube_qos:Burstable",
      "pod_name:kube-apiserver-kind-control-plane",
      "pod_phase:running"
    ],
    "host": "kind-control-plane-adel-test-rtloader",
    "type": "gauge",
    "interval": 0,
    "source_type_name": "System"
  }
]
....

Note: you migh not get the tags on each run due to lag of initialisation of workloadmeta and tagger. However, as long as you are getting the tags at least once, you can consider the QA as done. You can also check the Datadog UI to validate that you can see the metric and aggregate it by tags:

image

Possible Drawbacks / Trade-offs

Rtloader exposes the tagger tag method to the python integrations running in the datadog agent.

Changing the signature of the Tag method breaks the rtloader interface, and thus breaks the calls to the tagger from the python integrations.

To preserve backward compatibility in regards for rtloader, the old signature is kept in the codebase, but now with the name LegacyTag, and the rtloader now redirects python calls to the tagger Tag method to the LegacyTag function.

The LegacyTag function receives the entityID as a string, parses the string to split it to a prefix and and an id, and redirects the call to the Tag function.

Additional Notes

@adel121 adel121 added this to the 7.60.0 milestone Oct 15, 2024
@adel121 adel121 requested review from a team as code owners October 15, 2024 12:49
@adel121 adel121 requested review from ankitpatel96 and removed request for a team October 15, 2024 12:49
@adel121 adel121 force-pushed the adelhajhassan/use_entityid_struct_in_tagger_component branch from e5f3e14 to 28cdd04 Compare October 15, 2024 12:52
@adel121 adel121 changed the title adelhajhassan/use entityid struct in tagger component [CONTP-388] use entityid struct in tagger component Oct 15, 2024
Copy link

cit-pr-commenter bot commented Oct 15, 2024

Go Package Import Differences

Baseline: b69a9ed
Comparison: 5b8925c

binaryosarchchange
serverlesslinuxamd64
+1, -0
+github.com/DataDog/datadog-agent/comp/core/tagger/common
serverlesslinuxarm64
+1, -0
+github.com/DataDog/datadog-agent/comp/core/tagger/common

@adel121 adel121 force-pushed the adelhajhassan/use_entityid_struct_in_tagger_component branch 2 times, most recently from fdf5e74 to 825243d Compare October 15, 2024 13:26
Copy link

cit-pr-commenter bot commented Oct 15, 2024

Regression Detector

@adel121 adel121 force-pushed the adelhajhassan/use_entityid_struct_in_tagger_component branch from 825243d to bffd7a1 Compare October 15, 2024 15:25
@agent-platform-auto-pr
Copy link
Contributor

agent-platform-auto-pr bot commented Oct 15, 2024

Test changes on VM

Use this command from test-infra-definitions to manually test this PR changes on a VM:

inv create-vm --pipeline-id=47245178 --os-family=ubuntu

Note: This applies to commit 5b8925c

@adel121 adel121 force-pushed the adelhajhassan/use_entityid_struct_in_tagger_component branch from bffd7a1 to d82fa97 Compare October 16, 2024 10:47
// If possible, avoid using this function, and use the Tag interface function instead.
// This function exists in order not to break backward compatibility with rtloader and python
// integrations using the tagger
func LegacyTag(entity string, cardinality types.TagCardinality) ([]string, error) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Since AIUI this API is not going away any time soon, would it make sense to give it a descriptive name? Something like GetTagsByString.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I see your point, but the thing here is that we need to push developers away from using this method because it includes an extra step of string parsing, which we can avoid by calling Tag method of the tagger.

This is why I think it is good to include something in the function name indicating that calling it should be avoided except in very specific cases.

How about:

LegacyTagByString ?

// integrations using the tagger
func LegacyTag(entity string, cardinality types.TagCardinality) ([]string, error) {
if globalTagger == nil {
return nil, fmt.Errorf("a global tagger must be set before calling Tag")
Copy link
Member

Choose a reason for hiding this comment

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

fmt.Errorf is a function aiming at formatting a string.
When there’s nothing to format, it’s much more efficient to use a function that just wraps the already formatted string into an error:

Suggested change
return nil, fmt.Errorf("a global tagger must be set before calling Tag")
return nil, errors.New("a global tagger must be set before calling Tag")

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Indeed you are right.

fmt.Errorf is already used in this file in many place, where it can be replaced by errors.New.

I updated all of them.

Copy link
Member

Choose a reason for hiding this comment

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

Indeed, I noticed that this pattern was common in our code base.
I’ve also noticed that the perfsprint linter, included in latest versions of golangci-lint complains about it.
So, we’ll hopefully have to fix all of them next time we update golangci-lint.


entityID, err := types.NewEntityIDFromString(entity)
if err != nil {
return []string{}, err
Copy link
Member

Choose a reason for hiding this comment

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

Does it make a difference to return an empty slice instead of nil (like what is done above line 53) in case error ?

Suggested change
return []string{}, err
return nil, err

var tags []string
if entityID != "" {
if entityID.Empty() {
Copy link
Member

Choose a reason for hiding this comment

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

This change looks counter-intuitive to me because I would have expected "" to be equivalent to .Empty() and not the other way round.

Shouldn’t this be:

Suggested change
if entityID.Empty() {
if entityID.NotEmpty() {

or

Suggested change
if entityID.Empty() {
if !entityID.Empty() {

?

var tags []string
if entityID != "" {
if entityID.Empty() {
Copy link
Member

Choose a reason for hiding this comment

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

This change looks counter-intuitive to me because I would have expected "" to be equivalent to .Empty() and not the other way round.

Shouldn’t this be:

Suggested change
if entityID.Empty() {
if entityID.NotEmpty() {

or

Suggested change
if entityID.Empty() {
if !entityID.Empty() {

?

@adel121 adel121 force-pushed the adelhajhassan/use_entityid_struct_in_tagger_component branch from 8399d27 to e6a0deb Compare October 16, 2024 14:44
@adel121
Copy link
Contributor Author

adel121 commented Oct 16, 2024

@L3n41c

thank you for you insightful comments and remarks.

I addressed all your comments in this commit.

Let me know if you find them satisfactory 🙇

@adel121 adel121 requested a review from a team as a code owner October 21, 2024 16:15
Copy link
Contributor

@louis-cqrl louis-cqrl left a comment

Choose a reason for hiding this comment

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

LGTM for file ASC owns

Copy link
Contributor

@louis-cqrl louis-cqrl left a comment

Choose a reason for hiding this comment

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

LGTM for file ASC owns

@adel121 adel121 force-pushed the adelhajhassan/switch_to_composite_store_and_use_entity_id_struct branch from eabaac2 to 146a410 Compare October 23, 2024 08:59
@adel121 adel121 requested review from a team as code owners October 23, 2024 08:59
Base automatically changed from adelhajhassan/switch_to_composite_store_and_use_entity_id_struct to main October 23, 2024 14:20
@adel121 adel121 force-pushed the adelhajhassan/use_entityid_struct_in_tagger_component branch from 2e0f6dd to 50cc5a2 Compare October 23, 2024 14:45
@adel121 adel121 removed request for a team October 23, 2024 14:45
Copy link
Contributor

📥 📢 Info, this pull request increases the binary size of serverless extension by 0 bytes. Each MB of binary size increase means about 10ms of additional cold start time, so this pull request would increase cold start time by 0ms.

Debug info

If you have questions, we are happy to help, come visit us in the #serverless slack channel and provide a link to this comment.

We suggest you consider adding the !serverless build tag to remove any new dependencies not needed in the serverless extension.

Copy link
Contributor

Serverless Benchmark Results

BenchmarkStartEndInvocation comparison between 4b7c06e and fd151e5.

tl;dr

Use these benchmarks as an insight tool during development.

  1. Skim down the vs base column in each chart. If there is a ~, then there was no statistically significant change to the benchmark. Otherwise, ensure the estimated percent change is either negative or very small.

  2. The last row of each chart is the geomean. Ensure this percentage is either negative or very small.

What is this benchmarking?

The BenchmarkStartEndInvocation compares the amount of time it takes to call the start-invocation and end-invocation endpoints. For universal instrumentation languages (Dotnet, Golang, Java, Ruby), this represents the majority of the duration overhead added by our tracing layer.

The benchmark is run using a large variety of lambda request payloads. In the charts below, there is one row for each event payload type.

How do I interpret these charts?

The charts below comes from benchstat. They represent the statistical change in duration (sec/op), memory overhead (B/op), and allocations (allocs/op).

The benchstat docs explain how to interpret these charts.

Before the comparison table, we see common file-level configuration. If there are benchmarks with different configuration (for example, from different packages), benchstat will print separate tables for each configuration.

The table then compares the two input files for each benchmark. It shows the median and 95% confidence interval summaries for each benchmark before and after the change, and an A/B comparison under "vs base". ... The p-value measures how likely it is that any differences were due to random chance (i.e., noise). The "~" means benchstat did not detect a statistically significant difference between the two inputs. ...

Note that "statistically significant" is not the same as "large": with enough low-noise data, even very small changes can be distinguished from noise and considered statistically significant. It is, of course, generally easier to distinguish large changes from noise.

Finally, the last row of the table shows the geometric mean of each column, giving an overall picture of how the benchmarks changed. Proportional changes in the geomean reflect proportional changes in the benchmarks. For example, given n benchmarks, if sec/op for one of them increases by a factor of 2, then the sec/op geomean will increase by a factor of ⁿ√2.

I need more help

First off, do not worry if the benchmarks are failing. They are not tests. The intention is for them to be a tool for you to use during development.

If you would like a hand interpreting the results come chat with us in #serverless-agent in the internal DataDog slack or in #serverless in the public DataDog slack. We're happy to help!

Benchmark stats
goos: linux
goarch: amd64
pkg: github.com/DataDog/datadog-agent/pkg/serverless/daemon
cpu: AMD EPYC 7763 64-Core Processor                
                                      │ baseline/benchmark.log │        current/benchmark.log        │
                                      │         sec/op         │    sec/op     vs base               │
api-gateway-appsec.json                            85.29µ ± 8%   86.57µ ± 11%       ~ (p=0.165 n=10)
api-gateway-kong-appsec.json                       67.02µ ± 4%   69.84µ ±  1%  +4.21% (p=0.005 n=10)
api-gateway-kong.json                              65.38µ ± 2%   67.69µ ±  3%  +3.53% (p=0.000 n=10)
api-gateway-non-proxy-async.json                   104.1µ ± 2%   107.5µ ±  2%  +3.30% (p=0.000 n=10)
api-gateway-non-proxy.json                         107.4µ ± 2%   107.5µ ±  2%       ~ (p=0.912 n=10)
api-gateway-websocket-connect.json                 69.18µ ± 1%   69.57µ ±  2%       ~ (p=1.000 n=10)
api-gateway-websocket-default.json                 64.00µ ± 2%   62.63µ ±  2%  -2.13% (p=0.023 n=10)
api-gateway-websocket-disconnect.json              62.85µ ± 2%   63.17µ ±  2%       ~ (p=0.971 n=10)
api-gateway.json                                   113.5µ ± 2%   113.4µ ±  3%       ~ (p=0.481 n=10)
application-load-balancer.json                     63.77µ ± 1%   64.12µ ±  4%       ~ (p=1.000 n=10)
cloudfront.json                                    47.80µ ± 3%   47.07µ ±  2%  -1.53% (p=0.011 n=10)
cloudwatch-events.json                             39.66µ ± 2%   38.20µ ±  3%  -3.70% (p=0.001 n=10)
cloudwatch-logs.json                               67.93µ ± 2%   67.23µ ±  3%       ~ (p=0.393 n=10)
custom.json                                        31.40µ ± 2%   31.31µ ±  2%       ~ (p=0.796 n=10)
dynamodb.json                                      93.79µ ± 1%   93.23µ ±  1%       ~ (p=0.160 n=10)
empty.json                                         29.40µ ± 2%   31.29µ ±  2%  +6.40% (p=0.000 n=10)
eventbridge-custom.json                            48.59µ ± 3%   50.24µ ±  2%  +3.40% (p=0.005 n=10)
eventbridge-no-bus.json                            47.32µ ± 1%   47.06µ ±  6%       ~ (p=0.971 n=10)
eventbridge-no-timestamp.json                      46.61µ ± 1%   46.72µ ±  1%       ~ (p=0.579 n=10)
eventbridgesns.json                                64.37µ ± 2%   65.01µ ±  2%       ~ (p=0.280 n=10)
eventbridgesqs.json                                72.73µ ± 1%   73.98µ ±  3%  +1.71% (p=0.035 n=10)
http-api.json                                      72.37µ ± 1%   73.14µ ±  3%       ~ (p=0.075 n=10)
kinesis-batch.json                                 71.28µ ± 1%   71.48µ ±  1%       ~ (p=0.796 n=10)
kinesis.json                                       54.56µ ± 3%   54.53µ ±  2%       ~ (p=0.315 n=10)
s3.json                                            60.47µ ± 2%   59.98µ ±  2%       ~ (p=0.256 n=10)
sns-batch.json                                     92.92µ ± 2%   95.57µ ±  3%  +2.85% (p=0.019 n=10)
sns.json                                           69.76µ ± 3%   69.00µ ±  2%       ~ (p=0.052 n=10)
snssqs.json                                        119.9µ ± 1%   120.4µ ±  2%       ~ (p=0.436 n=10)
snssqs_no_dd_context.json                          106.8µ ± 2%   108.6µ ±  4%  +1.69% (p=0.003 n=10)
sqs-aws-header.json                                60.34µ ± 2%   60.29µ ±  3%       ~ (p=0.912 n=10)
sqs-batch.json                                     96.12µ ± 3%   97.87µ ±  2%       ~ (p=0.123 n=10)
sqs.json                                           74.09µ ± 1%   76.86µ ±  4%  +3.74% (p=0.007 n=10)
sqs_no_dd_context.json                             69.15µ ± 4%   70.03µ ±  3%       ~ (p=0.247 n=10)
stepfunction.json                                  47.22µ ± 5%   47.66µ ±  5%       ~ (p=0.971 n=10)
geomean                                            66.47µ        67.03µ        +0.84%

                                      │ baseline/benchmark.log │        current/benchmark.log        │
                                      │          B/op          │     B/op      vs base               │
api-gateway-appsec.json                           37.27Ki ± 0%   37.27Ki ± 0%       ~ (p=0.810 n=10)
api-gateway-kong-appsec.json                      26.93Ki ± 0%   26.93Ki ± 0%       ~ (p=0.402 n=10)
api-gateway-kong.json                             24.43Ki ± 0%   24.44Ki ± 0%       ~ (p=0.100 n=10)
api-gateway-non-proxy-async.json                  48.07Ki ± 0%   48.08Ki ± 0%       ~ (p=0.516 n=10)
api-gateway-non-proxy.json                        47.29Ki ± 0%   47.31Ki ± 0%       ~ (p=0.247 n=10)
api-gateway-websocket-connect.json                25.50Ki ± 0%   25.50Ki ± 0%       ~ (p=0.539 n=10)
api-gateway-websocket-default.json                21.41Ki ± 0%   21.41Ki ± 0%       ~ (p=0.255 n=10)
api-gateway-websocket-disconnect.json             21.19Ki ± 0%   21.19Ki ± 0%       ~ (p=0.782 n=10)
api-gateway.json                                  49.59Ki ± 0%   49.58Ki ± 0%       ~ (p=0.305 n=10)
application-load-balancer.json                    22.37Ki ± 0%   22.38Ki ± 0%       ~ (p=0.362 n=10)
cloudfront.json                                   17.66Ki ± 0%   17.66Ki ± 0%       ~ (p=0.696 n=10)
cloudwatch-events.json                            11.71Ki ± 0%   11.70Ki ± 0%       ~ (p=0.753 n=10)
cloudwatch-logs.json                              53.38Ki ± 0%   53.39Ki ± 0%       ~ (p=0.107 n=10)
custom.json                                       9.729Ki ± 0%   9.740Ki ± 0%  +0.11% (p=0.045 n=10)
dynamodb.json                                     40.78Ki ± 0%   40.78Ki ± 0%       ~ (p=0.724 n=10)
empty.json                                        9.287Ki ± 0%   9.308Ki ± 0%  +0.23% (p=0.024 n=10)
eventbridge-custom.json                           15.03Ki ± 0%   15.04Ki ± 0%       ~ (p=0.591 n=10)
eventbridge-no-bus.json                           13.99Ki ± 0%   14.02Ki ± 0%       ~ (p=0.127 n=10)
eventbridge-no-timestamp.json                     14.03Ki ± 0%   14.03Ki ± 0%       ~ (p=0.796 n=10)
eventbridgesns.json                               20.96Ki ± 0%   20.95Ki ± 0%       ~ (p=0.271 n=10)
eventbridgesqs.json                               25.15Ki ± 0%   25.14Ki ± 0%       ~ (p=0.955 n=10)
http-api.json                                     23.87Ki ± 0%   23.88Ki ± 0%       ~ (p=0.127 n=10)
kinesis-batch.json                                27.12Ki ± 0%   27.12Ki ± 0%       ~ (p=0.670 n=10)
kinesis.json                                      17.89Ki ± 0%   17.83Ki ± 1%  -0.32% (p=0.029 n=10)
s3.json                                           20.42Ki ± 0%   20.42Ki ± 1%       ~ (p=0.436 n=10)
sns-batch.json                                    39.96Ki ± 0%   39.96Ki ± 0%       ~ (p=0.810 n=10)
sns.json                                          25.13Ki ± 1%   25.15Ki ± 1%       ~ (p=0.540 n=10)
snssqs.json                                       53.85Ki ± 0%   53.86Ki ± 0%       ~ (p=0.796 n=10)
snssqs_no_dd_context.json                         47.47Ki ± 0%   47.52Ki ± 0%       ~ (p=0.353 n=10)
sqs-aws-header.json                               19.51Ki ± 0%   19.50Ki ± 0%       ~ (p=0.353 n=10)
sqs-batch.json                                    42.22Ki ± 0%   42.30Ki ± 0%       ~ (p=0.671 n=10)
sqs.json                                          26.23Ki ± 0%   26.32Ki ± 1%       ~ (p=0.197 n=10)
sqs_no_dd_context.json                            21.87Ki ± 1%   21.87Ki ± 0%       ~ (p=0.739 n=10)
stepfunction.json                                 14.23Ki ± 1%   14.30Ki ± 2%       ~ (p=0.739 n=10)
geomean                                           24.56Ki        24.57Ki       +0.04%

                                      │ baseline/benchmark.log │        current/benchmark.log        │
                                      │       allocs/op        │ allocs/op   vs base                 │
api-gateway-appsec.json                             629.0 ± 0%   629.0 ± 0%       ~ (p=1.000 n=10)
api-gateway-kong-appsec.json                        488.0 ± 0%   488.0 ± 0%       ~ (p=1.000 n=10) ¹
api-gateway-kong.json                               466.0 ± 0%   466.0 ± 0%       ~ (p=1.000 n=10) ¹
api-gateway-non-proxy-async.json                    725.0 ± 0%   726.0 ± 0%       ~ (p=0.370 n=10)
api-gateway-non-proxy.json                          716.0 ± 0%   716.0 ± 0%       ~ (p=1.000 n=10)
api-gateway-websocket-connect.json                  453.0 ± 0%   453.0 ± 0%       ~ (p=1.000 n=10)
api-gateway-websocket-default.json                  379.0 ± 0%   379.0 ± 0%       ~ (p=1.000 n=10)
api-gateway-websocket-disconnect.json               370.0 ± 0%   370.0 ± 0%       ~ (p=1.000 n=10)
api-gateway.json                                    791.0 ± 0%   791.0 ± 0%       ~ (p=1.000 n=10)
application-load-balancer.json                      352.0 ± 0%   352.0 ± 0%       ~ (p=1.000 n=10) ¹
cloudfront.json                                     284.0 ± 0%   284.0 ± 0%       ~ (p=1.000 n=10)
cloudwatch-events.json                              220.0 ± 0%   220.0 ± 0%       ~ (p=1.000 n=10)
cloudwatch-logs.json                                215.5 ± 0%   216.0 ± 0%       ~ (p=0.350 n=10)
custom.json                                         168.0 ± 0%   168.0 ± 0%       ~ (p=1.000 n=10)
dynamodb.json                                       589.0 ± 0%   589.0 ± 0%       ~ (p=0.474 n=10)
empty.json                                          159.0 ± 1%   160.0 ± 0%  +0.63% (p=0.020 n=10)
eventbridge-custom.json                             266.5 ± 0%   267.0 ± 0%       ~ (p=0.720 n=10)
eventbridge-no-bus.json                             257.0 ± 0%   258.0 ± 0%       ~ (p=0.179 n=10)
eventbridge-no-timestamp.json                       258.0 ± 0%   258.0 ± 0%       ~ (p=0.211 n=10)
eventbridgesns.json                                 326.0 ± 0%   326.0 ± 0%       ~ (p=0.628 n=10)
eventbridgesqs.json                                 367.0 ± 0%   367.0 ± 0%       ~ (p=1.000 n=10)
http-api.json                                       434.0 ± 0%   434.0 ± 0%       ~ (p=0.700 n=10)
kinesis-batch.json                                  392.0 ± 0%   392.0 ± 0%       ~ (p=0.464 n=10)
kinesis.json                                        286.0 ± 0%   285.0 ± 1%  -0.35% (p=0.025 n=10)
s3.json                                             359.0 ± 0%   358.5 ± 0%       ~ (p=0.224 n=10)
sns-batch.json                                      479.0 ± 0%   479.0 ± 1%       ~ (p=0.769 n=10)
sns.json                                            346.0 ± 1%   346.0 ± 1%       ~ (p=0.151 n=10)
snssqs.json                                         478.5 ± 0%   478.5 ± 1%       ~ (p=0.883 n=10)
snssqs_no_dd_context.json                           435.5 ± 1%   436.0 ± 0%       ~ (p=0.419 n=10)
sqs-aws-header.json                                 287.0 ± 1%   287.0 ± 0%       ~ (p=0.448 n=10)
sqs-batch.json                                      515.5 ± 1%   516.0 ± 1%       ~ (p=0.833 n=10)
sqs.json                                            364.5 ± 1%   366.0 ± 1%       ~ (p=0.178 n=10)
sqs_no_dd_context.json                              349.0 ± 1%   349.5 ± 0%       ~ (p=0.580 n=10)
stepfunction.json                                   237.0 ± 1%   238.5 ± 2%       ~ (p=0.892 n=10)
geomean                                             367.0        367.3       +0.07%
¹ all samples are equal

@adel121
Copy link
Contributor Author

adel121 commented Oct 23, 2024

/merge

@dd-devflow
Copy link

dd-devflow bot commented Oct 23, 2024

🚂 MergeQueue: pull request added to the queue

The median merge time in main is 22m.

Use /merge -c to cancel this operation!

@dd-mergequeue dd-mergequeue bot merged commit 1a79c74 into main Oct 23, 2024
329 of 337 checks passed
@dd-mergequeue dd-mergequeue bot deleted the adelhajhassan/use_entityid_struct_in_tagger_component branch October 23, 2024 16:43
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.