просмотреть оглавление
- Бизнес-сценарий |Синхронная реализация seckill: практика Redis в функции seckill
- Шаблоны проектирования |Понимание шаблонов проектирования в одном предложении
- Apache SkyWalking | Продвинутый геймплей SkyWalking
- Apache SkyWalking | Практика разработки Java-плагинов SkyWalking
- Распределенное планирование заданий |Распределенная операционная платформа Lianjia (рекомендовано автором)
введение
«Практика использования подключаемого модуля SkyWalking Java»: эта статья будет основана на версии SkyWalking 6.0.0-GA-SNAPSHOT для написания клиента Redis.Lettuce
Возьмем в качестве примера подключаемый модуль SkyWalking Java Agent. Я поделюсь с вами процессом внесения вклада в PR и надеюсь, что вам будет полезно понять подключаемый модуль SkyWalking Java Agent.
Основные понятия
OpenTracing
и модуль связи SkyWalking несколько очень важных семантических понятий.
-
Span: может пониматься как вызов метода, вызов программного блока или доступ к RPC/базе данных. Пока это доступ к программе с полным периодом времени, его можно считать промежутком. SkyWalking
Span
Важные свойства в объектахАтрибуты имя Примечание component компоненты Название компонента плагина, например: Lettuce, см.: ComponentsDefine.Class. tag Этикетка k-v структура, ключевые теги, ключевые детали: Tags.Class. peer одноранговые ресурсы Он используется для диаграммы топологии.Если используется компонент БД, необходимо записать информацию о кластере. operationName Название действия Если span=0, выпадающий список, который будет искать OperationName. layer показывать Отображается на странице ссылки. Дополнительные сведения см. в разделе SpanLayer.Class. -
Трассировка: цепочка вызовов неявно определяется принадлежащим ей Span. Трассу можно рассматривать как направленный ациклический граф (граф DAG), состоящий из нескольких отрезков.В модуле ссылок SkyWalking видно, что трасса состоит из нескольких принадлежащих ему сегментов трассы.
-
Сегмент трассировки: Сегмент — это концепция в SkyWalking, которая должна включать все области действия каждого запроса в один процесс ОС, обычно в один поток на основе языка. Он состоит из нескольких промежутков, принадлежащих операции этого потока.
Основной API
Межпроцессный API ядра ContextCarrier
- Чтобы реализовать распределенную трассировку, трассировки должны быть связаны между процессами, а контекст должен распространяться по всему процессу. Это работа ContextCarrier.
- Вот шаги, которые необходимо реализовать для распространения между процессами:
- На стороне клиента создайте новый пустой ContextCarrier и поместите всю информацию ContextCarrier в заголовки HTTP, вложения Dubbo или сообщения Kafka.
- Передайте ContextCarrier серверу через сервисный вызов.
- На стороне сервера получить все сообщения ContextCarrier в заголовках, вложениях или сообщениях соответствующего компонента. Свяжите информацию о ссылке сервера и клиента.
Многопоточный основной API ContextSnapshot
- В дополнение к кросс-процессу, также необходимо поддерживать кросс-поток. Например, асинхронные потоки (очереди сообщений в памяти) и пакетная обработка очень распространены в Java. Кросс-процесс и кросс-поток очень похожи, потому что они оба необходимо распространять контекст. Единственное отличие состоит в том, что межпоточная сериализация не требуется.
- Вот шаги, которые нужно реализовать для распространения между потоками:
- Используйте ContextManager#capture, чтобы получить объект ContextSnapshot.
- Разрешить дочернему потоку доступ к ContextSnapshot любым способом, либо через параметры метода, либо через существующие параметры.
- Используйте ContextManager#продолжение в дочерних потоках.
Для получения подробных сведений об основных API-интерфейсах вы можете нажать, чтобы прочитать "Руководство по разработке плагинов — китайская версия》
Плагин Практика
Салат работает с кодом Redis
@PostMapping("/ping")
public String ping(HttpServletRequest request) throws ExecutionException, InterruptedException {
RedisClient redisClient = RedisClient.create("redis://" + "127.0.0.1" + ":6379");
StatefulRedisConnection<String, String> connection0 = redisClient.connect();
RedisAsyncCommands<String, String> asyncCommands0 = connection0.async();
AsyncCommand<String, String, String> future = (AsyncCommand<String, String, String>)asyncCommands0.set("key_a", "value_a");
future.onComplete(s -> OkHttpClient.call("http://skywalking.apache.org"));
future.get();
connection0.close();
redisClient.shutdown();
return "pong";
}
Структура исходного кода плагина
Салат инкапсулирует Redis и RedissonRedisson
Точно так же цель состоит в том, чтобы реализовать клиент Redis для Java, который прост в использовании и не требует обучения. Поэтому, если вы сначала перехватываете операции Redis, вам необходимо изучить исходный код соответствующего клиента.
Плагин дизайна
Понимание процесса реализации плагина и поиск наилучшего местоположения InterceptPoint является основой внедрения плагина в SkyWalking.Код
URL PR:Support lettuce plugin
Проблемы, возникающие на практике
- Использование отладочных точек останова в многопоточном программировании превратит ссылку в синхронизацию.Рекомендуется использовать режим выполнения для увеличения журнала или удаленную отладку для ее решения.
- Многопоточное программирование требует использования межпотокового основного API ContextSnapshot, иначе связь будет разорвана.
- Метод CompleteableCommand.onComplete иногда выполняется синхронно, что связано с внутренним механизмом, а иногда поток не отделяется.
- Если скомпилированная версия плагина 1.7+, плагин необходимо поместить в дополнительный плагин. Поскольку сниффер поддерживает версию 1.6.
Совместимость с плагинами
Чтобы плагин получил окончательную совместимую версию плагина, нам нужно использовать докер для тестирования всех версий плагина. Конкретные шаги заключаются в следующем:
- Написание тестовых случаев: чтобы узнать, как писать тестовые примеры, следуйтеКак писать документациюреализовать.
- Предоставляет автоматизированные тест-кейсы. Такие как:Тестовый пример плагина Redisson
- Убедитесь, что несколько популярных локальных версий подключаемых модулей работают должным образом локально.
- После предоставления автоматических тестовых случаев и отправки тестов в CI отправитель плагина утверждает ваш плагин.
- Наконец-то получите полный отчет о тестировании плагина.
Pull Request
Отправить PR
При подаче PR вам необходимо кратко описать ваш дизайн плагина, что поможет вам обсудить и завершить проверку кода с участниками сообщества.
Подать заявку на автоматизированное тестирование
После того, как тест-кейс будет написан, вы можете подать заявку на автоматическое тестирование, и в вашем PR будет сгенерирован отчет о версии, совместимой с плагином.
Документация по плагину
Документацию плагина необходимо обновить:Supported-list.mdПоддержка связанной информации о плагинах.
Если плагин является необязательным, он должен быть вagent-optional-pluginsДобавьте соответствующее описание в дополнительную документацию плагина.
Примечания
Lettuce — полностью неблокирующий клиент Redis, созданный с помощью netty, который обеспечивает реактивный, асинхронный и синхронный доступ к данным. Нажмите, чтобы прочитать подробностиlettuce.io;
OpenTracing — это стандарт для разных языков программирования. Для получения подробной информации нажмите, чтобы прочитать "Семантический стандарт OpenTracing";
Интерфейс span:org.apache.skywalking.apm.agent.core.context.trace.AbstractSpan определяет методы, которые должны выполнять все реализации Span;
Redisson — очень простой в использовании клиент Redis для Java, он не требует обучения, вам не нужно знать какие-либо команды Redis, чтобы начать его использовать. Нажмите, чтобы прочитать подробностиredisson.org;