Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Ez a cikk az Azure-függvény OpenTelemetria-támogatását mutatja be, amely integrált Application Insights- és OpenTelemetria-támogatással teszi lehetővé az elosztott nyomkövetést több függvényhívás között. Az első lépésekhez egy Azure Developer CLI-(azd) sablont használ a kódprojekt létrehozásához, valamint azt az Azure-üzembe helyezést, amelyben az alkalmazást futtatni szeretné.
Ebben az oktatóanyagban a azd eszközt a következőkre használhatja:
- OpenTelemetry-kompatibilis projekt inicializálása sablonból.
- Tekintse át az OpenTelemetry-integrációt lehetővé tevő kódot.
- Futtassa és ellenőrizze az OpenTelemetry-kompatibilis alkalmazást helyileg.
- Függvényalkalmazás és kapcsolódó erőforrások létrehozása az Azure-ban.
- Telepítse a kódprojektet az Azure-beli függvényalkalmazásban.
- Ellenőrizze az elosztott nyomkövetést az Application Insightsban.
A sablon által létrehozott szükséges Azure-erőforrások az azure-beli biztonságos és méretezhető függvényalkalmazások üzembe helyezésének aktuális ajánlott eljárásait követik. Ugyanez a azd parancs a kódprojektet is üzembe helyezi az új függvényalkalmazásban az Azure-ban.
Alapértelmezés szerint a Flex Consumption csomag egy használatalapú fizetéses számlázási modellt követ, ami azt jelenti, hogy ennek a rövid útmutatónak a végrehajtása néhány USD cent vagy annál kisebb költséggel jár az Azure-fiókjában.
Fontos
Ez a cikk jelenleg csak a C#, a Python és a TypeScript használatát támogatja. A rövid útmutató elvégzéséhez válasszon egyet a cikk tetején található támogatott nyelvek közül.
Előfeltételek
Egy Azure-fiók, aktív előfizetéssel. Hozzon létre egy fiókot ingyenesen.
A projekt inicializálása
azd init A paranccsal hozzon létre egy helyi Azure Functions-kódprojektet egy Olyan sablonból, amely openTelemetry elosztott nyomkövetést tartalmaz.
A helyi terminálban vagy parancssorban futtassa ezt a
azd initparancsot egy üres mappában:azd init --template functions-quickstart-python-azd-otel -e flexquickstart-otelEz a parancs lekéri a projektfájlokat a sablontárházból , és inicializálja a projektet az aktuális mappában. A
-ejelölő megadja az aktuális környezet nevét. Ebbenazdaz esetben a környezet egy egyedi üzembehelyezési környezetet tart fenn az alkalmazás számára, és egynél több definiálható. A környezet neve az Azure-ban létrehozott erőforráscsoport nevében is megjelenik.
A helyi terminálban vagy parancssorban futtassa ezt a
azd initparancsot egy üres mappában:azd init --template functions-quickstart-typescript-azd-otel -e flexquickstart-otelEz a parancs lekéri a projektfájlokat a sablontárházból , és inicializálja a projektet az aktuális mappában. A
-ejelölő megadja az aktuális környezet nevét. Ebbenazdaz esetben a környezet egy egyedi üzembehelyezési környezetet tart fenn az alkalmazás számára, és egynél több definiálható. A környezet neve az Azure-ban létrehozott erőforráscsoport nevében is megjelenik.
A helyi terminálban vagy parancssorban futtassa ezt a
azd initparancsot egy üres mappában:azd init --template functions-quickstart-dotnet-azd-otel -e flexquickstart-otelEz a parancs lekéri a projektfájlokat a sablontárházból , és inicializálja a projektet az aktuális mappában. A
-ejelölő megadja az aktuális környezet nevét. Ebbenazdaz esetben a környezet egy egyedi üzembehelyezési környezetet tart fenn az alkalmazás számára, és egynél több definiálható. A környezet neve az Azure-ban létrehozott erőforráscsoport nevében is megjelenik.
A kód áttekintése
A sablon egy teljes elosztott nyomkövetési forgatókönyvet hoz létre három, közösen működő funkcióval. Tekintsük át az OpenTelemetryvel kapcsolatos legfontosabb szempontokat:
OpenTelemetry-konfiguráció
A src/otel-sample/host.json fájl engedélyezi az OpenTelemetryt a Functions-gazdagépen:
{
"version": "2.0",
"telemetryMode": "OpenTelemetry",
"extensions": {
"serviceBus": {
"maxConcurrentCalls": 10
}
},
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.0.0)"
}
}
A kulcsbeállítás "telemetryMode": "OpenTelemetry" lehetővé teszi az elosztott nyomkövetést a függvényhívások között.
A src/OTelSample/host.json fájl engedélyezi az OpenTelemetryt a Functions-gazdagépen:
{
"version": "2.0",
"telemetryMode": "OpenTelemetry",
"logging": {
"OpenTelemetry": {
"logLevel": {
"Host.General": "Warning"
}
}
}
}
A kulcsbeállítás "telemetryMode": "OpenTelemetry" lehetővé teszi az elosztott nyomkövetést a függvényhívások között.
Az OpenTelemetry függőségei
A src/otel-sample/requirements.txt fájl tartalmazza az OpenTelemetry-integrációhoz szükséges csomagokat:
azure-functions
azure-monitor-opentelemetry
requests
A azure-monitor-opentelemetry csomag az OpenTelemetry és az Application Insights integrációját biztosítja.
A src/otel-sample/package.json fájl tartalmazza az OpenTelemetry-integrációhoz szükséges csomagokat:
{
"dependencies": {
"@azure/functions": "^4.0.0",
"@azure/functions-opentelemetry-instrumentation": "^0.1.0",
"@azure/monitor-opentelemetry-exporter": "^1.0.0",
"axios": "^1.6.0"
}
}
A @azure/functions-opentelemetry-instrumentation és @azure/monitor-opentelemetry-exporter csomagok biztosítják az OpenTelemetry-integrációt az Application Insightsszal.
A .csproj fájl tartalmazza az OpenTelemetry-integrációhoz szükséges csomagokat:
<PackageReference Include="Azure.Monitor.OpenTelemetry.Exporter" Version="1.4.0" />
<PackageReference Include="Microsoft.Azure.Functions.Worker.OpenTelemetry" Version="1.4.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.Http" Version="1.10.0" />
Ezek a csomagok biztosítják az OpenTelemetry-integrációt az Application Insightsszal és a HTTP-rendszerezéssel az elosztott nyomkövetéshez.
Függvény implementálása
A src/otel-sample/function_app.py függvényei egy elosztott nyomkövetési folyamatot mutatnak be.
Első HTTP-függvény
@app.function_name("first_http_function")
@app.route(route="first_http_function", auth_level=func.AuthLevel.ANONYMOUS)
def first_http_function(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function (first) processed a request.')
# Call the second function
base_url = f"{req.url.split('/api/')[0]}/api"
second_function_url = f"{base_url}/second_http_function"
response = requests.get(second_function_url)
second_function_result = response.text
result = {
"message": "Hello from the first function!",
"second_function_response": second_function_result
}
return func.HttpResponse(
json.dumps(result),
status_code=200,
mimetype="application/json"
)
Második HTTP-függvény
@app.function_name("second_http_function")
@app.route(route="second_http_function", auth_level=func.AuthLevel.ANONYMOUS)
@app.service_bus_queue_output(arg_name="outputsbmsg", queue_name="%ServiceBusQueueName%",
connection="ServiceBusConnection")
def second_http_function(req: func.HttpRequest, outputsbmsg: func.Out[str]) -> func.HttpResponse:
logging.info('Python HTTP trigger function (second) processed a request.')
message = "This is the second function responding."
# Send a message to the Service Bus queue
queue_message = "Message from second HTTP function to trigger ServiceBus queue processing"
outputsbmsg.set(queue_message)
logging.info('Sent message to ServiceBus queue: %s', queue_message)
return func.HttpResponse(
message,
status_code=200
)
Service Bus üzenetsor eseményindító
@app.service_bus_queue_trigger(arg_name="azservicebus", queue_name="%ServiceBusQueueName%",
connection="ServiceBusConnection")
def servicebus_queue_trigger(azservicebus: func.ServiceBusMessage):
logging.info('Python ServiceBus Queue trigger start processing a message: %s',
azservicebus.get_body().decode('utf-8'))
time.sleep(5) # Simulate processing work
logging.info('Python ServiceBus Queue trigger end processing a message')
Az OpenTelemetry konfigurációja a következő helyen src/otel-sample/index.tsvan beállítva:
import { AzureFunctionsInstrumentation } from '@azure/functions-opentelemetry-instrumentation';
import { AzureMonitorTraceExporter, AzureMonitorLogExporter } from '@azure/monitor-opentelemetry-exporter';
import { getNodeAutoInstrumentations, getResourceDetectors } from '@opentelemetry/auto-instrumentations-node';
import { registerInstrumentations } from '@opentelemetry/instrumentation';
import { detectResources } from '@opentelemetry/resources';
import { LoggerProvider, SimpleLogRecordProcessor } from '@opentelemetry/sdk-logs';
import { NodeTracerProvider, SimpleSpanProcessor } from '@opentelemetry/sdk-trace-node';
const resource = detectResources({ detectors: getResourceDetectors() });
const tracerProvider = new NodeTracerProvider({
resource,
spanProcessors: [new SimpleSpanProcessor(new AzureMonitorTraceExporter())]
});
tracerProvider.register();
const loggerProvider = new LoggerProvider({
resource,
processors: [new SimpleLogRecordProcessor(new AzureMonitorLogExporter())],
});
registerInstrumentations({
tracerProvider,
loggerProvider,
instrumentations: [getNodeAutoInstrumentations(), new AzureFunctionsInstrumentation()],
});
A függvények a src/otel-sample/src/functions mappában vannak definiálva:
Első HTTP-függvény
export async function firstHttpFunction(
request: HttpRequest,
context: InvocationContext
): Promise<HttpResponseInit> {
context.log("TypeScript HTTP trigger function (first) processed a request.");
try {
// Call the second function
const baseUrl = request.url.split("/api/")[0];
const secondFunctionUrl = `${baseUrl}/api/second_http_function`;
const response = await axios.get(secondFunctionUrl);
const secondFunctionResult = response.data;
const result = {
message: "Hello from the first function!",
second_function_response: secondFunctionResult,
};
return {
status: 200,
body: JSON.stringify(result),
headers: { "Content-Type": "application/json" },
};
} catch (error) {
return {
status: 500,
body: JSON.stringify({ error: "Failed to process request" }),
};
}
}
Második HTTP-függvény
export async function secondHttpFunction(
request: HttpRequest,
context: InvocationContext
): Promise<HttpResponseInit> {
context.log("TypeScript HTTP trigger function (second) processed a request.");
const message = "This is the second function responding.";
// Send a message to the Service Bus queue
const queueMessage =
"Message from second HTTP function to trigger ServiceBus queue processing";
context.extraOutputs.set(serviceBusOutput, queueMessage);
context.log("Sent message to ServiceBus queue:", queueMessage);
return {
status: 200,
body: message,
};
}
Service Bus-üzenetsor-eseményindító
export async function serviceBusQueueTrigger(
message: unknown,
context: InvocationContext
): Promise<void> {
context.log("TypeScript ServiceBus Queue trigger start processing a message:", message);
// Simulate processing time
await new Promise((resolve) => setTimeout(resolve, 5000));
context.log("TypeScript ServiceBus Queue trigger end processing a message");
}
Az OpenTelemetry konfigurációja a következő helyen src/OTelSample/Program.csvan beállítva:
using Azure.Monitor.OpenTelemetry.Exporter;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.OpenTelemetry;
using OpenTelemetry.Trace;
var builder = FunctionsApplication.CreateBuilder(args);
builder.ConfigureFunctionsWebApplication();
builder.Logging.AddOpenTelemetry(logging =>
{
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
});
builder.Services.AddOpenTelemetry()
.WithTracing(tracing =>
{
tracing.AddHttpClientInstrumentation();
});
builder.Services.AddOpenTelemetry().UseAzureMonitorExporter();
builder.Services.AddOpenTelemetry().UseFunctionsWorkerDefaults();
builder.Services.AddHttpClient();
builder.Build().Run();
A függvények külön osztályfájlokban vannak definiálva:
Első HTTP-függvény
public class FirstHttpTrigger
{
private readonly ILogger<FirstHttpTrigger> _logger;
private readonly IHttpClientFactory _httpClientFactory;
public FirstHttpTrigger(ILogger<FirstHttpTrigger> logger, IHttpClientFactory httpClientFactory)
{
_logger = logger;
_httpClientFactory = httpClientFactory;
}
[Function("first_http_function")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
{
_logger.LogInformation("first_http_function function processed a request.");
var baseUrl = $"{req.Url.AbsoluteUri.Split("/api/")[0]}/api";
var targetUri = $"{baseUrl}/second_http_function";
var client = _httpClientFactory.CreateClient();
var response = await client.GetAsync(targetUri);
var content = await response.Content.ReadAsStringAsync();
return new OkObjectResult($"Called second_http_function, status: {response.StatusCode}, content: {content}");
}
}
Második HTTP-függvény
public class SecondHttpTrigger
{
private readonly ILogger<SecondHttpTrigger> _logger;
public SecondHttpTrigger(ILogger<SecondHttpTrigger> logger)
{
_logger = logger;
}
[Function("second_http_function")]
public MultiResponse Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req)
{
_logger.LogInformation("second_http_function function processed a request.");
return new MultiResponse
{
Messages = new string[] { "Hello" },
HttpResponse = req.CreateResponse(System.Net.HttpStatusCode.OK)
};
}
}
public class MultiResponse
{
[ServiceBusOutput("%ServiceBusQueueName%", Connection = "ServiceBusConnection")]
public string[]? Messages { get; set; }
[HttpResult]
public HttpResponseData? HttpResponse { get; set; }
}
Service Bus Queue-eseményindító
public class ServiceBusQueueTrigger
{
private readonly ILogger<ServiceBusQueueTrigger> _logger;
public ServiceBusQueueTrigger(ILogger<ServiceBusQueueTrigger> logger)
{
_logger = logger;
}
[Function("servicebus_queue_trigger")]
public async Task Run(
[ServiceBusTrigger("%ServiceBusQueueName%", Connection = "ServiceBusConnection")]
ServiceBusReceivedMessage message,
ServiceBusMessageActions messageActions)
{
_logger.LogInformation("Message ID: {id}", message.MessageId);
_logger.LogInformation("Message Body: {body}", message.Body);
// Complete the message
await messageActions.CompleteMessageAsync(message);
}
}
Elosztott nyomkövetési folyamat
Ez az architektúra egy teljes elosztott nyomkövetési forgatókönyvet hoz létre a következő viselkedéssel:
- Az első HTTP-függvény HTTP-kérést kap, és meghívja a második HTTP-függvényt
- A második HTTP-függvény válaszol, és üzenetet küld a Service Busnak
- A Service Bus-eseményindító késleltetve dolgozza fel az üzenetet a feldolgozási munka szimulálásához
Az OpenTelemetry implementáció főbb szempontjai:
-
OpenTelemetry-integráció: A
host.jsonfájl engedélyezi az OpenTelemetryt a következővel:"telemetryMode": "OpenTelemetry" - Függvényláncolás: Az első függvény HTTP-kérések használatával hívja meg a másodikat, és korrelált nyomkövetéseket hoz létre
- Service Bus-integráció: A második függvény a Service Busnak ad ki kimenetet, amely a harmadik függvényt aktiválja
-
Névtelen hitelesítés: A HTTP-függvények használják
auth_level=func.AuthLevel.ANONYMOUS, ezért nincs szükség függvénykulcsra
A teljes sablonprojektet itt tekintheti át.
-
OpenTelemetria-integráció: A
index.tsfájl konfigurálja az OpenTelemetryt az Azure Monitor-exportőrökkel nyomkövetésekhez és naplókhoz - Függvényláncolás: Az első függvény automatikus nyomkövetési propagálású axios használatával hívja meg a másodikat
- Service Bus-integráció: A második függvény kimeneti kötések használatával kimenetet ad ki a Service Busnak, amely a harmadik függvényt aktiválja
- Felügyelt identitás: Minden Service Bus-kapcsolat felügyelt identitást használ kapcsolati sztringek helyett
- Feldolgozási szimuláció: A Service Bus-eseményindító 5 másodperces késleltetése az üzenetfeldolgozási munkát szimulálja
A teljes sablonprojektet itt tekintheti át.
-
OpenTelemetria-integráció: A
Program.csfájl konfigurálja az OpenTelemetryt az Azure Monitor-exportőrrel - Függvényláncolás: Az első függvény meghívja a másodikat a HttpClient és az OpenTelemetry rendszerezés használatával
- Service Bus-integráció: A második függvény kimeneti kötések használatával kimenetet ad ki a Service Busnak, amely a harmadik függvényt aktiválja
- Felügyelt identitás: Minden Service Bus-kapcsolat felügyelt identitást használ kapcsolati sztringek helyett
- .NET 8 Izolált feldolgozó: A legújabb Azure Functions .NET izolált feldolgozói modellt használja a jobb teljesítmény és rugalmasság érdekében
A teljes sablonprojektet itt tekintheti át.
Miután helyben ellenőrizte a függvényeket, ideje közzétenni őket az Azure-ban.
Telepítés az Azure-ra
Ez a projekt úgy van konfigurálva, hogy a azd up parancsot használva telepítse ezt a projektet az Azure-ban egy új függvényalkalmazásba, egy Flex Consumtion csomagban OpenTelemetry-támogatással.
Jótanács
Ez a projekt tartalmaz egy Bicep-fájlkészletet, amelyek azd használatával biztonságos üzembe helyezést hoznak létre egy Flex fogyasztási tervhez, amely az ajánlott legjobb gyakorlatokat követi, beleértve a kezelt identitáskapcsolatokat is.
Futtassa ezt a parancsot, hogy
azdlétrehozza a szükséges Azure-erőforrásokat az Azure-ban, és üzembe helyezze a kódprojektet az új függvényalkalmazásban:azd upA gyökérmappa tartalmazza a
azure.yamlszükséges definíciófájltazd.Ha még nem jelentkezett be, a rendszer arra kéri, hogy hitelesítse az Azure-fiókjával.
Amikor a rendszer kéri, adja meg a szükséges üzembehelyezési paramétereket:
Paraméter Description Azure-előfizetés Előfizetés, amelyben az erőforrások létrejönnek. Azure-lokáció Azure-régió, amelyben létre kell hozni az új Azure-erőforrásokat tartalmazó erőforráscsoportot. Csak azok a régiók jelennek meg, amelyek jelenleg támogatják a Rugalmas felhasználás csomagot. A
azd upparancs a Bicep konfigurációs fájljaival a következő kérdésekre adott választ használja az üzembehelyezési feladatok elvégzéséhez:Hozza létre és konfigurálja ezeket a szükséges Azure-erőforrásokat (a következőnek felel meg
azd provision):- Az Azure Functions Flex használati csomagja és függvényalkalmazása az OpenTelemetry engedélyezésével
- Azure Storage (kötelező) és Application Insights (ajánlott)
- Service Bus-névtér és üzenetsor elosztott nyomkövetési bemutatóhoz
- Hozzáférési szabályzatok és szerepkörök a fiókhoz
- Szolgáltatásközi kapcsolatok felügyelt identitásokkal (tárolt kapcsolati sztring helyett)
Csomagolja és telepítse a kódot az üzembehelyezési tárolóba (ez egyenértékű a következőval
azd deploy). Az alkalmazás ezután elindul, és az üzembe helyezett csomagban fut.
A parancs sikeres végrehajtása után megjelennek a létrehozott erőforrásokra mutató hivatkozások.
Elosztott nyomkövetés tesztelése
Most tesztelheti az OpenTelemetry elosztott nyomkövetési funkcióit az üzembe helyezett függvények meghívásával és az Application Insights telemetriájának megfigyelésével.
A függvény meghívása az Azure-ban
A függvényvégpontokat az Azure-ban http-kérésekkel hívhatja meg az URL-címekre. Mivel a sablon HTTP-függvényei névtelen hozzáféréssel vannak konfigurálva, nincs szükség függvénykulcsra.
A helyi terminálban vagy parancssorban futtassa ezt a parancsot a függvényalkalmazás nevének lekéréséhez és az URL-cím létrehozásához:
APP_NAME=$(azd env get-value AZURE_FUNCTION_NAME) echo "Function URL: https://$APP_NAME.azurewebsites.net/api/first_http_function"A
azd env get-valueparancs lekéri a függvényalkalmazás nevét a helyi környezetből.Tesztelje a függvényt a böngészőben az URL-címre való navigálással:
https://your-function-app.azurewebsites.net/api/first_http_functionCserélje le
your-function-appaz előző lépésben szereplő tényleges függvényalkalmazás nevére. Ez az egyetlen kérés egy elosztott nyomkövetést hoz létre, amely mindhárom függvényen végigfolyik.
Elosztott nyomkövetés megtekintése az Application Insightsban
A függvény meghívása után megfigyelheti a teljes elosztott nyomkövetést az Application Insightsban:
Megjegyzés:
A függvény meghívása után eltarthat néhány percig, amíg a telemetriai adatok megjelennek az Application Insightsban. Ha nem látja azonnal az adatokat, várjon néhány percet, és frissítse a nézetet.
Nyissa meg az Application Insights-erőforrást az Azure Portalon (ugyanabban az erőforráscsoportban található, mint a függvényalkalmazás).
Nyissa meg az alkalmazástérképet az elosztott nyomkövetés mindhárom függvényben való megtekintéséhez. Látnia kell, ahogy a HTTP-kérés átjut a függvényeken, majd továbbhalad a Service Buson.
A tranzakciókereséssel megkeresheti a kérést, és megtekintheti a teljes nyomkövetési ütemtervet. Keressen tranzakciókat a függvényalkalmazásból.
Válasszon ki egy adott tranzakciót a végpontok közötti nyomkövetés megtekintéséhez, amely a következőt mutatja:
- A HTTP-kérés a következőre:
first_http_function - A belső HTTP-hívás a(z)
second_http_function-ra/ről - Az elküldött Service Bus-üzenet
- A
servicebus_queue_triggerfeldolgozza a Service Bus üzenetét
- A HTTP-kérés a következőre:
A nyomkövetési részletekben a következőt láthatja:
- Időzítési információk: Az egyes lépések hossza
- Függőségek: A függvények közötti kapcsolatok
- Naplók: A nyomkövetéssel korrelált alkalmazásnaplók
- Teljesítménymetrikák: Válaszidők és átviteli sebesség
Ez a példa a teljes körű elosztott nyomkövetést mutatja be több Azure Functionsben OpenTelemetry-integrációval, így teljes betekintést nyújt az alkalmazás viselkedésébe és teljesítményébe.
A kód ismételt üzembe helyezése
Futtassa a azd up parancsot annyiszor, amennyi szükséges az Azure-erőforrások kiépítéséhez és a kódfrissítések üzembe helyezéséhez a függvényalkalmazásban.
Megjegyzés:
A legújabb üzembehelyezési csomag mindig felülírja az üzembe helyezett kódfájlokat.
A kérésekre adott kezdeti válaszokat azd és az általuk azd létrehozott környezeti változókat a rendszer helyileg tárolja a nevesített környezetben.
azd env get-values A paranccsal áttekintheti a környezet összes változóját, amelyet a parancs az Azure-erőforrások létrehozásakor használ.
Erőforrások tisztítása
Ha végzett a függvényalkalmazással és a kapcsolódó erőforrásokkal, ezzel a paranccsal törölheti a függvényalkalmazást és annak kapcsolódó erőforrásait az Azure-ból, és elkerülheti a további költségek felmerülését:
azd down --no-prompt
Megjegyzés:
A --no-prompt beállítás arra utasítja azd , hogy az erőforráscsoportot anélkül törölje, hogy ön megerősítést kap.
Ez a parancs nincs hatással a helyi kódprojektre.