AppDynamics в linux контейнерах для .net приложений.

Square

Эта статья написана с целью структуризировать знания полученные в процессе настройки AppDynamics.

Что такое AppDynamics?

AppDynamics один из лидеров систем APM (Application performance monitoring) который служит для мониторинга приложений. С помошью AppDynamics можно автоматически отображать бизнес транзакции приложений, отслеживать проблемы с достопностью сервисов, видеть проблемы производительности с точки зрения накладных расходов. Также есть возможность отслеживать действия клиента чтобы видеть как пользовательский опыт трансформируеться от начала до конца.

Как это работает?

  1. Отслеживание бизнес транзакций.
  2. Если возникают проблемы это все отображаеться в контроллере, приходит уведомление IT команде.
  3. Сбор и анализ данных в контексте обнаружение источника проблемы.

Вот примерный перечень данных который отслеживаеться  APM:

  • Response time
  • Error rate
  • CPU usage
  • Customer satisfaction
  • User experience
  • Number of instances
  • Request rates
  • Application availability/uptime
  • Garbage collection (GC)

О причинах использования  APM в проектах обзоре работы можно почитать в следующей статье https://research.aimultiple.com/apm/ я постараюсь перейти к конкретному примеру.

Итак перейдем к практике:

Определим стек:

  • Back: сервисы .net5
  • DB: MSSQL, MySQL
  • UI: React, Angular

Что бы поиграться с AppDynamics, лучшим вариантом будет зарегистрировать бесплатный аккаунт который будет доступен 1 месяц. После регистрации AppDynamics предлагает вам познакомиться с функционалом, самым простым путем,  установкой стартового wizard.exe на ваш сервер, предпологаеться что есть некий IIS на нем крутиться api, и данные довольно быстро попадают в AppDynamics, после установки агента и настройки агента.  Все очень просто, если мы работаем с легаси проектом и у нас есть windows server и не ограниченные ресурсы, так как после установки агента нагрузка на сервер увеличиваеться в 2 раза.

Но мне нужно было разобраться как это работает с k8s и контейнерами.

Для начала смотрим в документацию https://docs.appdynamics.com/21.6/en/application-monitoring/install-app-server-agents/net-agent/net-agent-for-linux/install-the-net-agent-for-linux

Итак для того что бы работать с AppDynamics нам нужно добавить 2 файла агента в контейнер и сконфигурировать его. Предположим что у нас большая команда и много сервисов, при таком подходе каждый разработчик должен положить к себе в репозиторий 2 файла и разобраться как с ними работать. Лучшим решением будет создать некий базовый docker image  который будет содержать в себе необходимые файлы и конфигурацию к ним. Это существенно упрощает работу,  инкапсулируя логику работы с агентами AppDynamics.

Для этих целей я создал bash скрипт, который скачивает и ставит агент внутри контейнера.

#!/bin/sh
echo '###Installing curl, unzip, curl'
apt-get update
apt-get clean

apt-get install -y \
    jq \
    unzip \
    curl
#######################################################################
# This script will fetch the latest AppDynamics Dotnet Core agent     #
# and place it in the current working directory.                      #
# This script requires:                                               #
# curl                                                                #
# unzip       							      #
# jq 								      #
#######################################################################

# Download Root URL
DOWNLOAD_PATH=https://download-files.appdynamics.com/

# Fetch latest Agent
FILE_PATH=$(curl https://download.appdynamics.com/download/downloadfilelatest/ | jq -r '.[].s3_path' | grep DotNetCore-linux-x64)

# Construct the full URL
DOWNLOAD_PATH=$DOWNLOAD_PATH$FILE_PATH

# Print URL to stdout
echo "Downloading agent from: " $DOWNLOAD_PATH

# Fetch agent and write into working directory
curl -L $DOWNLOAD_PATH -o ./DotNetCore-linux-x64.zip

# Unzip the agent in current working directory
unzip -u ./DotNetCore-linux-x64.zip -x AppDynamicsConfig.json.template README.md
# Remove the zip
rm -f ./DotNetCore-linux-x64.zip

после этого, сам docker image выглядит следующим образом:

FROM mcr.microsoft.com/dotnet/aspnet:5.0

RUN mkdir -p /opt/appdynamics/dotnet
WORKDIR /opt/appdynamics/dotnet

COPY downloadDotNetLinuxAgentLatest.sh .
RUN chmod +x downloadDotNetLinuxAgentLatest.sh
RUN ./downloadDotNetLinuxAgentLatest.sh

ENV CORECLR_PROFILER={57e1aa68-2229-41aa-9931-a6e93bbc64d8}
ENV CORECLR_ENABLE_PROFILING=1
ENV CORECLR_PROFILER_PATH=/opt/appdynamics/dotnet/libappdprofiler.so

вот как мы это используем:

image который содержит в себе агенты AppDynamics, располагаетьсся в azure container registry

Далее нужно указать параметры конфигурации для AppDynamics. Так как в нашем случае используется pipeline azure переменные мы передаем через pipeline. О том какие переменные что означают Вы можете прочитать здесь: https://docs.appdynamics.com/21.6/en/application-monitoring/install-app-server-agents/net-agent/net-agent-for-linux/net-agent-for-linux-environment-variables

После деплоя Вы заходите на Ваш контроллер и видете приблизительно такую картину, которая будет выглядеть по разному в зависимости от Вашего приложения.

Здесь изображено два .net приложения, в linux контейнерах, которые общаються между собой с помощью azure topic и MSSQL.

После этого можно наблюдать все бизнес транзакции Ваших приложений.

В дальнейшем статься будет обновляться.

Итнересные заметки:

Контейнер который содержит в себе приложение с AppDynamics, потребляет в 2 раза больше RAM чем без него.