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) yELASTIC_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.