Saltar a contenido

Elastic APM Out Of The Box

Quick start

El agente puede instrumentar automáticamente aplicaciones .NET Framework, .NET Core y .NET mediante las API de creación de perfiles de .NET CLR. Las Profiling API proporcionan una forma de instrumentar una aplicación o código de dependencia sin cambios en el código.

Configuración de Dockerfile

Para configurar Profiler Auto instrumentation del Apm atraves de Dockerfile, tenemos ir colocando nuestras instrucciones en 2 de las etapas del build en Docker:

La primera sería antes de buildear la aplicación:

ARG AGENT_VERSION=1.22.0
FROM ghcr.io/architecture-it/net:6.0-sdk as build
ARG AGENT_VERSION
WORKDIR /src

RUN apk update && apk add zip curl

RUN curl -L -o elastic_apm_profiler_${AGENT_VERSION}.zip https://github.com/elastic/apm-agent-dotnet/releases/download/v${AGENT_VERSION}/elastic_apm_profiler_${AGENT_VERSION}-linux-x64.zip && \
    unzip elastic_apm_profiler_${AGENT_VERSION}.zip -d ../src/elastic_apm_profiler

WORKDIR /app
COPY . .
RUN dotnet restore
WORKDIR "/app/src/Api"
RUN dotnet build "PrubaApi.csproj" -c Release -o /app/build

en esta estapa estamos descargando e instalando el agente antes de buildear la aplicación.

Luego, después de publicar:

FROM build AS publish
RUN dotnet publish "PruebaApi.csproj" -c Release -o /app/publish

FROM ghcr.io/architecture-it/net:6.0
COPY --from=publish /app/publish .

WORKDIR /elastic_apm_profiler
COPY --from=publish /src/elastic_apm_profiler .

WORKDIR /app

ENV CORECLR_ENABLE_PROFILING=1

ENV CORECLR_PROFILER={FA65FE15-F085-4681-9B20-95E04F6C03CC}

ENV CORECLR_PROFILER_PATH=/elastic_apm_profiler/libelastic_apm_profiler.so

ENV ELASTIC_APM_PROFILER_HOME=/elastic_apm_profiler

ENV ELASTIC_APM_PROFILER_INTEGRATIONS=/elastic_apm_profiler/integrations.yml

ENV ELASTIC_APM_PROFILER_LOG=warn

ENV ELASTIC_APM_SERVICE_NAME=PruebaApi

ENV ELASTIC_APM_ENVIRONMENT=Development

ENV ELASTIC_APM_SERVER_URL=https://apm-server-architecture-it-test.apps.ocptest.andreani.com.ar

ENV ELASTIC_APM_VERIFY_SERVER_CERT=false 

ENV ELASTIC_APM_LOG_LEVEL=Debug

ENTRYPOINT ["dotnet", "PruebaApi.dll"]

En esta última etapa copiamos los archivos primero y luego agregamos las environment que necesita el agente.

Así quedaría nuestro Dockerfile:

ARG AGENT_VERSION=1.22.0
FROM ghcr.io/architecture-it/net:6.0-sdk as build
ARG AGENT_VERSION
WORKDIR /src

RUN apk update && apk add zip curl

RUN curl -L -o elastic_apm_profiler_${AGENT_VERSION}.zip https://github.com/elastic/apm-agent-dotnet/releases/download/v${AGENT_VERSION}/elastic_apm_profiler_${AGENT_VERSION}-linux-x64.zip && \
    unzip elastic_apm_profiler_${AGENT_VERSION}.zip -d ../src/elastic_apm_profiler

WORKDIR /app
COPY . .
RUN dotnet restore
WORKDIR "/app/src/Api"
RUN dotnet build "{ProjectName}.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "{ProjectName}.csproj" -c Release -o /app/publish

FROM ghcr.io/architecture-it/net:6.0
COPY --from=publish /app/publish .

WORKDIR /elastic_apm_profiler
COPY --from=publish /src/elastic_apm_profiler .

WORKDIR /app

ENV CORECLR_ENABLE_PROFILING=1

ENV CORECLR_PROFILER={FA65FE15-F085-4681-9B20-95E04F6C03CC}

ENV CORECLR_PROFILER_PATH=/elastic_apm_profiler/libelastic_apm_profiler.so

ENV ELASTIC_APM_PROFILER_HOME=/elastic_apm_profiler

ENV ELASTIC_APM_PROFILER_INTEGRATIONS=/elastic_apm_profiler/integrations.yml

ENV ELASTIC_APM_PROFILER_LOG=warn

ENV ELASTIC_APM_SERVICE_NAME={ProjectName}

ENV ELASTIC_APM_ENVIRONMENT=Development

ENV ELASTIC_APM_SERVER_URL=https://apm-server-architecture-it-test.apps.ocptest.andreani.com.ar

ENV ELASTIC_APM_VERIFY_SERVER_CERT=false 

ENV ELASTIC_APM_LOG_LEVEL=Debug

ENTRYPOINT ["dotnet", "{ProjectName}.dll"]

Warning

  • Para que funcione correctamente se debe reemplazar {ProjectName} por el nombre del .csproj de nuestra Api o Worker.
  • Es importante tener las ENV ELASTIC_APM_SERVICE_NAME(nombre del proyecto) y ELASTIC_APM_SERVER_URL(la url del APM correspondiente al entorno) con los datos correctos.

En caso de nuestro proyecto no esté usando ninguna librería de Aquitectura podemos usar el siguiente dockerfile:

ARG AGENT_VERSION=1.22.0
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
ARG AGENT_VERSION
WORKDIR /src

RUN apt-get update && apt-get install zip curl

RUN curl -L -o elastic_apm_profiler_${AGENT_VERSION}.zip https://github.com/elastic/apm-agent-dotnet/releases/download/v${AGENT_VERSION}/elastic_apm_profiler_${AGENT_VERSION}-linux-x64.zip && \
    unzip elastic_apm_profiler_${AGENT_VERSION}.zip -d ../src/elastic_apm_profiler

COPY ["{ProjectPath}/{ProjectName}.csproj", "{ProjectPath}/"]
RUN dotnet restore "{ProjectPath}/{ProjectName}.csproj"
COPY . .
WORKDIR "/{ProjectPath}/"
RUN dotnet build "{ProjectName}.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "{ProjectName}.csproj" -c Release -o /app/publish 

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS runtime
WORKDIR /app
EXPOSE 80
EXPOSE 443

WORKDIR /elastic_apm_profiler
COPY --from=publish /src/elastic_apm_profiler .

WORKDIR /app
COPY --from=publish /app/publish .

ENV CORECLR_ENABLE_PROFILING=1

ENV CORECLR_PROFILER={FA65FE15-F085-4681-9B20-95E04F6C03CC}

ENV CORECLR_PROFILER_PATH=/elastic_apm_profiler/libelastic_apm_profiler.so

ENV ELASTIC_APM_PROFILER_HOME=/elastic_apm_profiler

ENV ELASTIC_APM_PROFILER_INTEGRATIONS=/elastic_apm_profiler/integrations.yml

ENV ELASTIC_APM_PROFILER_LOG=warn

ENV ELASTIC_APM_SERVICE_NAME={ProjectName}

ENV ELASTIC_APM_ENVIRONMENT=Development

ENV ELASTIC_APM_SERVER_URL=https://apm-server-architecture-it-test.apps.ocptest.andreani.com.ar

ENV ELASTIC_APM_VERIFY_SERVER_CERT=false 

ENV ELASTIC_APM_LOG_LEVEL=Debug

ENTRYPOINT ["dotnet", "{ProjectName}.dll"]

Notas

Environments fijas:

  • CORECLR_ENABLE_PROFILING: Configura si la creación de perfiles está activada para el proceso que se está ejecutando actualmente.
  • CORECLR_PROFILER: Especifica el GUID del perfilador a cargar en el proceso actualmente en ejecución.
  • CORECLR_PROFILER_PATH: Especifica la ruta a la DLL del perfilador que se cargará en el proceso que se está ejecutando actualmente (o en un proceso de 32 o 64 bits).
  • ELASTIC_APM_PROFILER_HOME: Especifica el directorio de inicio de la instrumentación automática del perfilador.
  • ELASTIC_APM_PROFILER_INTEGRATIONS: Especifica la ruta de acceso al archivo integrations.yml que determina los métodos a los que debe dirigirse la instrumentación automática.

Environments modificables:

  • ELASTIC_APM_PROFILER_LOG: Especifica el nivel de registro en el que el perfilador debe registrar.
  • ELASTIC_APM_SERVICE_NAME: Opciones de configuración del núcleo / Especifica el nombre del servicio (ElasticApm:ServiceName).
  • ELASTIC_APM_ENVIRONMENT: Opciones de configuración del núcleo / Especifica el entorno (ElasticApm:Environment).
  • ELASTIC_APM_SERVER_URL: Opciones de configuración del reportero / Especifica la URL de tu Servidor APM (ElasticApm:ServerUrl).
  • ELASTIC_APM_VERIFY_SERVER_CERT: Opciones de configuración del reportero / Especifica si el agente debe verificar el certificado SSL si se utiliza conexión HTTPS al servidor APM (ElasticApm:VerifyServerCert).
  • ELASTIC_APM_SERVER_CERT: Opciones de configuración del reportero / Especifica la ruta a un certificado codificado PEM utilizado para SSL/TLS por el servidor APM (ElasticApm:ServerCert).
  • ELASTIC_APM_LOG_LEVEL: Opciones de configuración de soporte / Establece el nivel de registro para el agente (ElasticApm:LogLevel).

{ProjectPath}: es la ruta en la que se encuentra el csproj de nuestra Api o Worker.