mirror of
https://github.com/microsoft/BCQuality.git
synced 2026-08-06 17:36:53 +01:00
Add 15 community knowledge articles from BC Code Intel ingest (#66)
* Add 15 community knowledge articles from BC Code Intel ingest Ingests net-new /community knowledge from BC Code Intelligence, surviving the admission test, gray-zone salvage, and dedup against the full corpus. Domains: ui (6), error-handling (3), performance (2), upgrade (1), appsource (1), security (1), telemetry (1). The two BC24 No. Series migration drafts are merged into one article. Adds good/bad AL samples for the clean-fit articles (error-handling, performance, security, telemetry). UI and appsource remain knowledge-only. Validator and knowledge-index checks pass (207 articles). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * Correct SetLoadFields JIT-load article to match MS docs The draft claimed accessing an unlisted field "reloads the entire row" per record. Microsoft's partial-records docs say otherwise: the platform does an implicit Get that loads the missing field(s), and in a direct var loop the first JIT updates the enumerator so later iterations do not re-load. The genuine per-row penalty is the pass-by-value case, where the copy's enumerator is not updated. Rewrite the article around JIT loading and the by-value footgun, rename the slug from ...full-reload to ...jit-load, and fix the good/bad samples to demonstrate the by-value repetition accurately. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Jeremy Vyska <jeremy@sparebrained.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
6281e7e39a
commit
4119417ce4
29 changed files with 613 additions and 0 deletions
|
|
@ -0,0 +1,17 @@
|
|||
codeunit 50136 "Telemetry Bad Sample"
|
||||
{
|
||||
procedure LogSyncDiagnostic(RecordsProcessed: Integer)
|
||||
var
|
||||
Dimensions: Dictionary of [Text, Text];
|
||||
begin
|
||||
Dimensions.Add('recordsProcessed', Format(RecordsProcessed));
|
||||
|
||||
// TelemetryScope::All pushes this internal diagnostic into every
|
||||
// customer's Application Insights too, inflating their ingestion cost
|
||||
// and burying their own signals in noise. ExtensionPublisher is the
|
||||
// correct scope for publisher-only diagnostics.
|
||||
Session.LogMessage(
|
||||
'SYNC001', 'Nightly sync completed.', Verbosity::Normal,
|
||||
DataClassification::SystemMetadata, TelemetryScope::All, Dimensions);
|
||||
end;
|
||||
}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
codeunit 50136 "Telemetry Good Sample"
|
||||
{
|
||||
procedure LogSyncDiagnostic(RecordsProcessed: Integer)
|
||||
var
|
||||
Dimensions: Dictionary of [Text, Text];
|
||||
begin
|
||||
Dimensions.Add('recordsProcessed', Format(RecordsProcessed));
|
||||
|
||||
// A diagnostic only the publisher acts on: route it to the publisher's
|
||||
// own Application Insights, not the customer's environment resource.
|
||||
Session.LogMessage(
|
||||
'SYNC001', 'Nightly sync completed.', Verbosity::Normal,
|
||||
DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, Dimensions);
|
||||
end;
|
||||
}
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
---
|
||||
bc-version: [all]
|
||||
domain: telemetry
|
||||
keywords: [telemetry, session-logmessage, telemetryscope, application-insights, extensionpublisher, ingestion-cost]
|
||||
technologies: [al]
|
||||
countries: [w1]
|
||||
application-area: [all]
|
||||
---
|
||||
|
||||
# Default TelemetryScope to ExtensionPublisher, not All
|
||||
|
||||
> Contributions welcome — open a PR to refine or extend this article.
|
||||
|
||||
## Description
|
||||
|
||||
The `TelemetryScope` parameter of `Session.LogMessage` (and `LogError`) controls *where* a custom telemetry signal is routed, not just whether it is emitted. `TelemetryScope::ExtensionPublisher` sends the signal only to the extension publisher's own Application Insights resource. `TelemetryScope::All` sends it to **both** the publisher's resource **and** the customer's environment-level Application Insights resource. The distinction is easy to get wrong because both values compile and both "emit telemetry" — but `All` silently adds to the customer's ingestion volume and cost.
|
||||
|
||||
## Best Practice
|
||||
|
||||
Default to `TelemetryScope::ExtensionPublisher` for diagnostic telemetry that only the publisher acts on. Reserve `TelemetryScope::All` for signals the customer's own administrators are expected to monitor and act on (for example, a business event surfaced to their environment telemetry). Treat the choice as a deliberate routing decision per signal, not a copy-paste default.
|
||||
|
||||
## Anti Pattern
|
||||
|
||||
Emitting all custom telemetry with `TelemetryScope::All` "to be safe." This pushes the publisher's internal diagnostics into every customer's Application Insights, inflating their ingestion cost and burying their own signals in noise — a footgun a code reviewer can catch by flagging `All` on any signal the customer would not act on.
|
||||
Loading…
Add table
Add a link
Reference in a new issue