diff --git a/app/Directory.Packages.props b/app/Directory.Packages.props index 602cb7e7..12f59475 100644 --- a/app/Directory.Packages.props +++ b/app/Directory.Packages.props @@ -8,6 +8,7 @@ + @@ -43,6 +44,9 @@ + + + diff --git a/app/backend/MinimalApi.csproj b/app/backend/MinimalApi.csproj index 04783d07..3bed56e7 100644 --- a/app/backend/MinimalApi.csproj +++ b/app/backend/MinimalApi.csproj @@ -17,6 +17,7 @@ + @@ -25,6 +26,9 @@ + + + diff --git a/app/backend/Program.cs b/app/backend/Program.cs index ecada14c..580f6af5 100644 --- a/app/backend/Program.cs +++ b/app/backend/Program.cs @@ -1,6 +1,13 @@ // Copyright (c) Microsoft. All rights reserved. +using Azure.Monitor.OpenTelemetry.Exporter; using Microsoft.AspNetCore.Antiforgery; +using OpenTelemetry; +using OpenTelemetry.Exporter; +using OpenTelemetry.Logs; +using OpenTelemetry.Metrics; +using OpenTelemetry.Resources; +using OpenTelemetry.Trace; var builder = WebApplication.CreateBuilder(args); @@ -17,14 +24,49 @@ builder.Services.AddAntiforgery(options => { options.HeaderName = "X-CSRF-TOKEN-HEADER"; options.FormFieldName = "X-CSRF-TOKEN-FORM"; }); builder.Services.AddHttpClient(); +List disposables = []; +static string? GetEnvVar(string key) => Environment.GetEnvironmentVariable(key); + if (builder.Environment.IsDevelopment()) { builder.Services.AddDistributedMemoryCache(); + var defaultEndpoint = GetEnvVar("OTEL_EXPORTER_OTLP_ENDPOINT") ?? "http://localhost:4317"; + builder.Logging.AddOpenTelemetry( + options => + { + options.AddOtlpExporter(config => { + config.Protocol = OtlpExportProtocol.Grpc; + config.Endpoint = new Uri(defaultEndpoint); + }); + } + ); + var meterProvider = Sdk.CreateMeterProviderBuilder() + .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("SearchDemo")) + .AddMeter("Microsoft.SemanticKernel*") + .AddMeter("Azure.*") + .AddOtlpExporter(config => + { + config.Protocol = OtlpExportProtocol.Grpc; + config.Endpoint = new Uri(defaultEndpoint); + }) + .Build(); + disposables.Add(meterProvider); + var traceProvider = Sdk.CreateTracerProviderBuilder() + .AddSource("Microsoft.SemanticKernel*") + .AddSource("Azure.*") + .AddSource("Microsoft.ML.*") + .AddAspNetCoreInstrumentation() + .AddHttpClientInstrumentation() + .AddOtlpExporter(config => + { + config.Protocol = OtlpExportProtocol.Grpc; + config.Endpoint = new Uri(defaultEndpoint); + }) + .Build(); + disposables.Add(traceProvider); } else { - static string? GetEnvVar(string key) => Environment.GetEnvironmentVariable(key); - builder.Services.AddStackExchangeRedisCache(options => { var name = builder.Configuration["AzureRedisCacheName"] + @@ -51,8 +93,6 @@ {name},abortConnect=false,ssl={ssl},allowAdmin=true,password={key} """; options.InstanceName = "content"; - - }); // set application telemetry @@ -62,6 +102,11 @@ { option.ConnectionString = appInsightsConnectionString; }); + var meterProvider = Sdk.CreateMeterProviderBuilder() + .AddMeter("Microsoft.SemanticKernel*") + .AddAzureMonitorMetricExporter(options => options.ConnectionString = appInsightsConnectionString) + .Build(); + disposables.Add(meterProvider); } } @@ -100,3 +145,8 @@ app.MapApi(); app.Run(); + +foreach (var d in disposables) +{ + d.Dispose(); +} diff --git a/app/shared/Shared/Services/AzureSearchEmbedService.cs b/app/shared/Shared/Services/AzureSearchEmbedService.cs index ab31d2b8..b1feb683 100644 --- a/app/shared/Shared/Services/AzureSearchEmbedService.cs +++ b/app/shared/Shared/Services/AzureSearchEmbedService.cs @@ -322,8 +322,8 @@ public IEnumerable
CreateSections( const int SentenceSearchLimit = 100; const int SectionOverlap = 100; - var sentenceEndings = new[] { '.', '!', '?' }; - var wordBreaks = new[] { ',', ';', ':', ' ', '(', ')', '[', ']', '{', '}', '\t', '\n' }; + var sentenceEndings = new[] { '.', '。', '.', '!', '?', '‼', '⁇', '⁈', '⁉' }; + var wordBreaks = new[] { ',', '、', ';', ':', ' ', '(', ')', '[', ']', '{', '}', '\t', '\n' }; var allText = string.Concat(pageMap.Select(p => p.Text)); var length = allText.Length; var start = 0;