web-dev-qa-db-ja.com

Azure関数でTelemetryConfigurationに依存関係を使用する方法

テレメトリーの構成のためにAzure関数で依存性注入を使用しようとします。私の関数では、関数コンストラクタでTelemetryConfigurationを挿入すると解決します。私はスタートアップでTelemetryConfigurationとどのようにすることがどのようにしているのか理解していないと思います。すでに構成されているTelemetryConfigurationをどのように追加しますか。

私はここでこれまでのことをやっていることを簡単にしました。

[Assembly: FunctionsStartup(typeof(StartUp))]
public class StartUp : FunctionsStartup
{
    private string OmsModule { get; } = "OMS.VA";

    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.Configure<TelemetryConfiguration>(
            (o) =>
            {
                o.InstrumentationKey = Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY");
                o.TelemetryInitializers.Add(new OperationCorrelationTelemetryInitializer());
            });
    }
}

public class StopPlaceUpdateTimerTrigger
{
    private TelemetryClient _telemetryClient;
    private string _azureWebJobsStorage;

    public StopPlaceUpdateTimerTrigger(TelemetryConfiguration telemetryConfiguration)
    {
        _telemetryClient = new TelemetryClient(telemetryConfiguration);
    }

    [FunctionName("StopPlaceLoader")]
    public async Task StopPlaceLoaderMain([TimerTrigger("%CRON_EXPRESSION%", RunOnStartup = true)]TimerInfo myTimerInfo, ILogger log, ExecutionContext context)
    {
        SetConfig(context);
        var cloudTable = await GetCloudTableAsync();
        if (cloudTable == null)
        {
            //Do nothing
        }
        //Do nothing
    }

    private async Task<CloudTable> GetCloudTableAsync()
    {
        var storageAccount = CloudStorageAccount.Parse(_azureWebJobsStorage);
        var tableClient = storageAccount.CreateCloudTableClient();
        var table = tableClient.GetTableReference(nameof(StopPlaceLoaderCacheRecord));

        if (!await table.ExistsAsync())
        {
            await table.CreateIfNotExistsAsync();
        }
        return table;
    }

    private void SetConfig(ExecutionContext context)
    {
        var config = new ConfigurationBuilder()
            .SetBasePath(context.FunctionAppDirectory)
            .AddJsonFile("local.settings.json", optional: true)
            .AddEnvironmentVariables()
            .Build();
        _azureWebJobsStorage = config["AzureWebJobsStorage"];
    }
}


//local.settings.json
{
"IsEncrypted": false,
"Values": {
"AzureWebJobsStorage": "DefaultEndpointsProtocol...",
"FUNCTIONS_WORKER_RUNTIME": "dotnet",
"EnableMSDeployAppOffline": "True",
    "CRON_EXPRESSION": "0 */5 22-3 * * *",
"APPINSIGHTS_INSTRUMENTATIONKEY": "..."
  }
}
 _

次の例外があります。 Microsoft.extensions.DependencyInjection.abstractions: 'oms.va.realtime.stopplaceloader.stopplaceUpdatetImerTrigger'をアクティブ化しようとしている間に、「Microsoft.ApplicationInsights.Extensibility.TeleMetryConfiguration」型のサービスを解決できません。

5
Roger Uhlin

builder.Services.Configure<TelemetryConfiguration>()を使用して設定する場合は、 ASP.NETコアのオプションパターン を使用しています。

オプションにアクセスするには、次のようにする必要があります。

public StopPlaceUpdateTimerTrigger(IOptionsMonitor<TelemetryConfiguration> telemetryConfiguration)
{
    _telemetryClient = new TelemetryClient(telemetryConfiguration.CurrentValue);
}
 _

直接TeleMetryConfigurationオブジェクトを直接使用したい場合は、サービスコレクションで追加する必要があります。

builder.Services.AddSingleton<TelemetryConfiguration >(sp =>
{
    var telemetryConfiguration = new TelemetryConfiguration();
    telemetryConfiguration.InstrumentationKey = Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY");
    telemetryConfiguration.TelemetryInitializers.Add(new OperationCorrelationTelemetryInitializer());
    return telemetryConfiguration;
}
 _

それからあなたはできます:

public StopPlaceUpdateTimerTrigger(TelemetryConfiguration telemetryConfiguration)
{
    _telemetryClient = new TelemetryClient(telemetryConfiguration);
}
 _

それが役に立てば幸い。

4
Jack Jia