Tag transactions with the Omeda brand - #45
Merged
Conversation
The first week of `matchedBy` data could not answer its own question. 30.7% of identifications matched by email with `none-supplied`, and there was no way to tell whether that is the genuine new-member rate or one publisher that never deployed the client change -- two situations needing completely different responses, indistinguishable in the data. Adoption sat flat at 65-70% across four days, which ruled out rollout lag in aggregate but said nothing about any single tenant. The brand was the missing dimension. It already reaches the `apiRequest` mongo log, but that cannot be faceted alongside transaction attributes, which is the whole point. Recorded in the plugin rather than in a resolver, for two reasons. The brand is a property of the request, so this covers every operation instead of one mutation. More importantly it is present on transactions that **throw** -- a resolver-level call never runs when the operation fails, and an errored request with no brand attached is unattributable. That matters here specifically: a client sending a field an older service does not accept fails at validation, before any resolver. SELECT count(*) FROM Transaction WHERE omedaMatchedBy IS NOT NULL FACET omedaBrand, omedaIdResolution SINCE 1 week ago No schema change, no client change, no coordinated deploy. The agent no-ops when disabled or outside a transaction. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The first week of
matchedBydata could not answer its own question.matchedByomedaIdResolutioncustomerIdresolvedemailnone-suppliedemaildivergedemailnone-activeThat 30.7% is either the genuine new-member rate (members with no stored id yet — resolves
itself, nothing to do) or a publisher that never deployed the client change (needs a dep bump).
Those need completely different responses and are indistinguishable in the current data. Adoption
sitting flat at 65–70% across four days ruled out rollout lag in aggregate, but says nothing about
any individual tenant.
The brand was the missing dimension. It already reaches the
apiRequestmongo log inlogRequest,but that cannot be faceted alongside transaction attributes — which is the entire point.
Why the plugin and not the resolver
Two reasons, and the second is the important one:
didResolveOperationcovers every operation rather than justrapidCustomerIdentification.addCustomAttributesnever runswhen the operation fails, so an errored request would carry no brand and be unattributable. That
matters concretely here: a client sending an input field an older service does not accept fails
at validation, before any resolver — exactly the failure mode the Deterministic Omeda customer matching on rapid identification #43 ship-order gate existed
to prevent, and precisely when you would most want to know which tenant it was.
What it enables
The last one is a general win beyond this work: service errors have never been attributable to a
tenant.
Scope
One line plus its rationale. No schema change, no client change, no coordinated deploy. The New
Relic agent no-ops when disabled or outside a transaction, so it is inert rather than fatal. Lint
clean, 14 specs passing, schema and plugin load verified.
After merge
Bump to 1.10.2 and push the
v1.10.2tag.🤖 Generated with Claude Code