Codeunit 8709 Telemetry Loggers Impl., source in 25

Source242526272829metadata in 25

src/System Application/App/Telemetry/src/Logging/TelemetryLoggersImpl.Codeunit.al63 lines, Copyright (c) Microsoft Corporation. MIT

// ------------------------------------------------------------------------------------------------
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License. See License.txt in the project root for license information.
// ------------------------------------------------------------------------------------------------

namespace System.Telemetry;

codeunit 8709 "Telemetry Loggers Impl."
{
    Access = Internal;
    InherentEntitlements = X;
    InherentPermissions = X;

    var
        RegisteredTelemetryLoggers: List of [Interface "Telemetry Logger"];
        RegisteredPublishers: List of [Text];
        CallStackPublishers: List of [Text];
        NoPublisherErr: Label 'An app from publisher %1 is sending telemetry, but there is no registered telemetry logger for this publisher.', Locked = true;
        RichTelemetryUsedTxt: Label 'A 3rd party app from publisher %1 is using rich telemetry.', Locked = true;
        TelemetryLibraryCategoryTxt: Label 'TelemetryLibrary', Locked = true;
        FirstPartyPublisherTxt: Label 'Microsoft', Locked = true;

    procedure Register(TelemetryLogger: Interface "Telemetry Logger"; Publisher: Text)
    begin
        if not CallStackPublishers.Contains(Publisher) then
            exit;

        if not RegisteredPublishers.Contains(Publisher) then begin
            RegisteredTelemetryLoggers.Add(TelemetryLogger);
            RegisteredPublishers.Add(Publisher);
        end;
    end;

    internal procedure GetTelemetryLogger(Publisher: Text; var TelemetryLogger: Interface "Telemetry Logger"): Boolean
    var
        IsLoggerFound: Boolean;
    begin
        IsLoggerFound := RegisteredPublishers.Contains(Publisher);

        if IsLoggerFound then begin
            TelemetryLogger := RegisteredTelemetryLoggers.Get(RegisteredPublishers.IndexOf(Publisher));
            if Publisher <> FirstPartyPublisherTxt then
                Session.LogMessage('0000HIW', StrSubstNo(RichTelemetryUsedTxt, Publisher), Verbosity::Normal, DataClassification::SystemMetadata, TelemetryScope::ExtensionPublisher, 'Category', TelemetryLibraryCategoryTxt);
        end else
            Session.LogMessage('0000G7K', StrSubstNo(NoPublisherErr, Publisher), Verbosity::Warning, DataClassification::SystemMetadata, TelemetryScope::All, 'Category', TelemetryLibraryCategoryTxt);

        exit(IsLoggerFound);
    end;

    internal procedure GetRelevantTelemetryLoggers(ExcludePublisher: Text) RelevantTelemetryLoggers: List of [Interface "Telemetry Logger"]
    var
        Publisher: Text;
    begin
        foreach Publisher in RegisteredPublishers do
            if Publisher <> ExcludePublisher then
                RelevantTelemetryLoggers.Add(RegisteredTelemetryLoggers.Get(RegisteredPublishers.IndexOf(Publisher)));
    end;

    internal procedure SetCallStackPublishers(Publishers: List of [Text])
    begin
        CallStackPublishers := Publishers;
    end;
}