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;