предисловие
Эта статья начинается с самого фундаментальногонаблюдаемостьначать, вызвать реализацию этой идеиAPM (управление производительностью приложений)Framework, благодаря пониманию основных компонентов и модели данных APM, может углубить пониманиеElasticAPMпонимание. Наконец, через фактические боевые упражнения ElasticAPM, чтобы добиться отслеживания производительности приложения.
наблюдаемость
«Наблюдаемость» — это не возможность, которую поставщик может предоставить независимо от системы, а атрибут, который вы встраиваете в свою систему, например, простота использования, высокая доступность и стабильность. Цель проектирования и создания «наблюдаемой» системы состоит в том, чтобы гарантировать, что когда она работает в производственной среде, люди, ответственные за ее эксплуатацию, могут обнаруживать плохое поведение (например, время простоя службы, ошибки, медленные ответы) и иметь полезную информацию для эффективного определения корневой системы. причины (например, подробные журналы событий, подробные сведения об использовании ресурсов и трассировки приложений). Эта цель может показаться обыденной, но организации сталкиваются со многими трудностями при ее достижении.Обычные проблемы включают в себя: сбор недостаточного количества информации, сбор слишком большого количества информации, но не получение полезного содержания, информация хранится в разных местах.
Как видно из приведенной выше цитаты,наблюдаемостьКлючевым моментом является решение проблемы, заключающейся в том, что трудно найти проблему, когда работающая система сталкивается с проблемой, особенно в крупномасштабной распределенной системе, бизнес-процесс зависит от многих вышестоящих и нижестоящих систем, что увеличивает сложность проблема с позиционированием. А система с хорошей наблюдаемостью может эффективно и с минимальными затратами обнаруживать критические проблемы. Наблюдаемость, показанная на рисунке ниже, имеет три основных опоры:
- Журнал: события, генерируемые работающей программой, которые могут подробно объяснять ее рабочий статус.
- Показатели: набор агрегированных значений, в основном используемых для мониторинга инфраструктуры (машины, контейнеры, сети и т. д.), но есть также приложения, используемые для мониторинга бизнес-уровня.Например, поисковая система с открытым исходным кодом Elasticsearch имеет информацию о запросе или объем записи, трудоемкость, процент отказов и другие индикаторы прикладного уровня;
- Монитор производительности приложений:Обратите внимание, что M здесь означает монитор, относится к отслеживанию (или мониторингу), которое уходит глубоко на уровень кода, включая внутренний процесс выполнения программы, вызов ссылки между службами и т. д., и может легко найти причину, по которой программа «медленная». APM чаще всего используется для отслеживания процесса обработки запросов на веб-сервере, включая внутреннюю логику выполнения, вызов внешних служб и соответствующие затраты времени.
Столько всего было сказано выше, давайте возьмем пример с точки зрения непрофессионала, когда бизнес-логика системы, за которую вы отвечаете, сложна и зависит от множества сторонних сервисов или промежуточного программного обеспечения. Однажды вы получили серию предупреждений о производительности, и ваш начальник спросил вас, почему интерфейс такой медленный? **Если наблюдаемость системы относительно плохая, вы будете дико логировать, посчитаете время между каждой строкой кода, а потом выйдете в интернет, проанализируете, какая строка медленнее в огромном океане логов, если найдете. вам повезло, просто удалите лог или измените уровень лога и снова выходите в онлайн!
Однако очень вероятно, что его не найдут.Произойдет ли в это время ГК? Какая пропускная способность использовалась в то время? Будет ли в это время большая нагрузка на сервер? Дождитесь возможности, поскольку у вас нет полных записей и вы не можете их воспроизвести, будет трудно гарантировать, что интерфейс, за который вы отвечаете, снова будет иметь проблемы с сигналом тревоги производительности, и ваш босс усомнится в ваших способностях! Это тяжело, верно?
Если к этому времени Бог дал вам полностью функциональную систему APM, вы можете передать информацию, записанную в будильнике.traceId, найдите соответствующую цепочку вызовов на платформе APM и обнаружите, что интерфейс, от которого вы зависите, отнимает много времени, или через вашMetricsВыяснилось, что РЖ очень часто встречался в это время, а затем проходилlogПолучите конкретную информацию о выполнении, Бинго! Я считаю, что проблема была неразлучна, ответ начальнику в течение 10 минут: "Я нашел проблему, причина в балабане", да, спросите меня, почему у меня APM, потому чтовсе под контролем.
Краткий обзор APM
Анализируя предыдущую главу, мы знаем, что такоенаблюдаемость. Что хороший продукт APM должен улучшать наблюдаемость приложения. Большинство продуктов APM, представленных сегодня на рынке,Мониторинг производительности приложений, но определено в Википедии какУправление производительностью приложений.
Определение APM в Википедии:Управление производительностью приложений, в то время как большинство продуктов APM на рынке определяются как мониторинг производительности приложений.«Что такое мониторинг производительности приложений и почему это не управление производительностью приложений»В этой статье считается, что мониторинг производительности приложений является частью управления производительностью приложений.Первый может помочь вам найти проблемы, а последний может помочь вам анализировать и решать проблемы. Но на самом деле большинство продуктов APM включают в себя часть анализа проблемы, а отрасль не проводит четкого различия между этими двумя определениями, поэтому в основном мы можем рассматривать их как одно и то же.
-
Мониторинг опыта конечных пользователей. Оптимизируйте пользовательский опыт, отслеживая поведение пользователей. Например: отслеживать взаимодействие пользователя с веб-интерфейсом/клиентом и записывать время событий взаимодействия.
-
Архитектура приложения во время выполнения. Понимать зависимости между сервисами, сетевую топологию взаимодействия приложений в архитектуре.
-
Деловая сделка. Создавайте содержательные отчеты SLA и предоставляйте информацию о тенденциях производительности приложений с точки зрения бизнеса.
-
Мониторинг компонентов глубокого погружения. Агенты обычно требуют установки и предназначены в основном для среднего уровня, включая веб-серверы, приложения и серверы сообщений. Надежный мониторинг должен показывать четкий путь к выполнению кода, так как этот параметр тесно связан со вторым вышеописанным параметром, а продукты APM часто объединяют эти два аспекта в одну функцию.
-
Анализ или отчетность (Analytics/reporting). Набор данных показателей, собранных из приложения, стандартизирован и представлен в виде общего представления данных о производительности приложения.
Введение в эластичный APM
Для получения подробной информации см.официальная документацияПодводя итог, ElasticAPM основан на ELK, он создал компоненты мониторинга производительности приложений и интегрировал существующие данные ведения журналов, метрик и трассировки, представленные APM, в единое решение.Платформа наблюдения за приложениями.
компоненты
Эластичный APM состоит из четырех компонентов:
- Агенты APM: Предоставляются в виде библиотеки приложений, собирают данные мониторинга производительности в программе и передают их на сервер APM.
- Сервер APM: получает данные от агентов APM, выполняет обработку контрольной суммы и записывает в индексы APM, специфичные для Elasticsearch. Хотя агент также может быть реализован как: сбор и обработка данных и передача их непосредственно в ES, официальная причина не делать этого — сохранить легкость агента, предотвратить некоторые риски безопасности и улучшить совместимость компонентов Elastic.
- Elasticsearch: используется для хранения данных о показателях производительности и предоставления возможностей агрегирования.
- Kibana: Визуализируйте данные о производительности и помогите найти узкие места производительности.
модель данных
Агент Elastic APM обнаруживает от него (instrument) приложения собирают различные типы данных, они называются событиями, а типы включают диапазон, транзакцию, ошибку и метрики.
- Span содержит информацию об определенном пути кода, который был выполнен. Они измеряются от начала до конца действия и могут иметь родительские/дочерние отношения с другими интервалами.
- Транзакция (Transaction) — это особый вид Span (родительского спана нет, от него могут быть получены только дочерние спаны, которые можно понимать как корневой узел «древовидной» структуры данных), с другими связанными с ним атрибутами. Транзакции можно рассматривать как работу самого высокого уровня в службе, такую как запрос в службе.
- Ошибка: событие ошибки содержит информацию об исходном исключении, которое произошло, или о журнале, созданном при возникновении исключения.
- Метрики: агент APM автоматически получает базовые метрики на уровне хоста, включая метрики ЦП и памяти на уровне системы и процесса. В дополнение к этому можно получить метрики для конкретных агентов, такие как метрики JVM в агентах Java и метрики времени выполнения Go в агентах Go.
Эластичный APM в действии
Установка среды
Подготовка инсталляционного пакета
Установите последнюю версию агента ELK и Apm.
Java agent: elastic-apm-agent-1.12.0.jar
Apm Server: apm-server-7.5.1-darwin-x86_64
ElasticSearch: elasticsearch-7.5.1
Kibana: kibana-7.5.1-darwin-x86_64
Строительство окружающей среды
Последовательность запуска среды следующая
-
Запустите ElasticSearch, порт по умолчанию 9200.
-
Запустите Kibana, порт по умолчанию 5601.
-
Запустите сервер APM,
./apm-server -e, порт по умолчанию — 8200. Поскольку сервер apm написан на Golang, среду Go необходимо установить локально. -
запустить приложение,
java -javaagent:/Tools/apm/elastic-apm-agent-1.12.0.jar -Delastic.apm.secret_token= -jar apm-0.0.1-SNAPSHOT.jar. Если вы используете Idea для запуска приложения, вы можете настроить его следующим образом.После запуска, если будет найден следующий лог, значит вплетен apm-java-agent. Агент Java принимаетByte BuddyТехнология динамически вплетена в байт-код, что делает агент ненавязчивым.
2020-01-08 15:09:32.603 [apm-server-healthcheck] INFO co.elastic.apm.agent.report.ApmServerHealthChecker - Elastic APM server is available: { "build_date": "2019-12-16T20:57:12Z", "build_sha": "348d8d83c3c823b64fc0692be607b1a5a8fac775", "version": "7.5.1"} 2020-01-08 15:09:32.779 [main] INFO co.elastic.apm.agent.configuration.StartupInfo - Starting Elastic APM 1.12.0 as sample_wsy on Java 1.8.0_201 (Oracle Corporation) Mac OS X 10.14.6
Демо-разработка
POM.xml, который необходимо внедрить в проектapm-agentЗависимость, apm-agent по умолчанию собирает некоторые события, такие как HTTP-запросы и запросы к базе данных, и, чтобы не вторгаться в приложение, он использует технологию плетения байт-кода для реализации java-agent, делая apm-agent прозрачным для бизнес-системы. но Прозрачный означает неуправляемый, apm также обеспечиваетpublic API, Управляемый вручную способ, скажите агенту собрать информацию.
Конкретный Java-агент имеет множество функций, в этой статье мы не будем вдаваться в подробности, см.официальная документация
<dependency>
<groupId>co.elastic.apm</groupId>
<artifactId>apm-agent-api</artifactId>
<version>1.12.0</version>
</dependency>
Код контроллера
@GetMapping("/test/{name}")
public String test(@PathVariable String name) {
String result = null;
Transaction transaction = ElasticApm.currentTransaction();
System.out.println(transaction.getTraceId());
try {
transaction.setName("WsyController#test");
transaction.setType("CUSTOM");
result = testService.test(name);
} catch (Exception e) {
transaction.captureException(e);
} finally {
//WARN co.elastic.apm.agent.impl.transaction.AbstractSpan - End has already been called: ''
//注意,如果调用ElasticApm.currentTransaction();就不需要transaction.end();否则会报如上警告
transaction.end();
}
return result;
}
Сервисный код
@Service
public class TestService {
public String test(String name) {
Span span = ElasticApm.currentTransaction().startSpan();
try {
span.setName("test0-wsy");
test1(name);
} catch (Exception e) {
span.captureException(e);
} finally {
span.end();
}
return "hello " + name;
}
public String test1(String name) {
Span span = ElasticApm.currentTransaction().startSpan();
try {
span.setName("test1-wsy");
} catch (Exception e) {
span.captureException(e);
} finally {
span.end();
}
return name;
}
}
После запроса контроллера обновите Kibana и обнаружите, что у вас уже есть отслеживание ссылок.
Задайте вопрос
1. Эта статья прошла тест в автономной среде, но в распределенной среде запросы будут последовательно подключать множество приложений.Можно ли реализовать отслеживание служб? Каков принцип реализации?
2. Elastic APM может автоматически собирать http-запросы.Может ли Elastic APM нормально работать в распределенной среде PRC? Нужно ли использоватьpublic APIреализовать?
Суммировать
1. APM может улучшить наблюдаемость системы
2. ElasticAPM может использовать ElasticSearch и Kibana для решения проблемы отслеживания ссылок за одну остановку.
Справочная документация
Dapper — система трассировки для крупномасштабных распределенных систем.
Dapper, a Large-Scale Distributed Systems Tracing Infrastructure
Официальный справочник агента Java APM 1.x
Распределенная система отслеживания Full Link и APM
Мониторинг производительности приложений с помощью Elastic APM
Наблюдаемость с эластичным стеком
Распределенная трассировка, открытая трассировка и ElasticAPM