Специфікація для референтного застосунку
Цей документ містить специфікацію референсного застосунку, який використовується в посібнику «Початок роботи».
Мета референсного застосунку — мати стандартизований зразок застосунку, який можна реалізувати всіма мовами, для яких існує SDK OpenTelemetry.
Загальні вимоги
- Реалізації Референсного застосунку належать SIG відповідних мов програмування, що реалізують API та SDK OpenTelemetry. Це гарантує, що застосунок відповідає найкращим практикам екосистеми мови програмування, і ми можемо надати план того, як слід інструментувати застосунок.
- Повинна бути версія застосунку без інструментування та з інструментуванням. Вона буде використана в посібнику «Початок роботи» на opentelemetry.io для переходу від застосунку без OpenTelemetry до повністю інструментованого застосунку.
- Повинна бути специфічна для мови дія CI, яка перевіряє, що застосунок компілюється та працює в обох версіях.
- Застосунок повинен запускатися з інтерфейсу командного рядка.
- Має бути файл Dockerfile для запуску застосунку в контейнерному середовищі.
- Застосунок повинен працювати автономно. Іншими словами, він не може мати жорстких залежностей від будь-якого іншого вмісту репозиторію, що його оточує. Це дозволяє користувачам копіювати код у свій власний проєкт без розплутування управління залежностями.
Вимоги до сервісу
- Застосунок повинен стандартно очікувати HTTP-запити на порту 8080. Порт повинен бути налаштований за допомогою змінної середовища APPLICATION_PORT.
- Для обробки HTTP-запитів слід використовувати бібліотеку, для якої доступна бібліотека інструментування. Застосунок повинен надавати точку доступу
/rolldice?rolls=<n>черезGET(та, за бажанням,POST) і повертати такі коди статусу HTTP та результати JSON:- якщо
rollsне встановлено або має дійсне вхідне значення ( позитивне ціле число > 0): код статусу200і або одне число від 1 до 6, якщоrollsне встановлено, або 1, або масив зnчисел від 1 до 6, деnє значеннямrolls - якщо
rollsвстановлено як недійсне вхідне значення (не число): код статусу400і{"status": "error", "message": "Parameter rolls must be a positive integer"} - якщо
rollsвстановлено як0або від’ємне ціле число: код статусу500і відсутність виводу JSON. Приклади помилок будуть використані для демонстрації того, як OpenTelemetry може бути використаний для виявлення помилок.
- якщо
- До точки доступу
/rolldiceможе бути доданий опціональний атрибутplayer=name. - Застосунок повинен виводити наступні рядки журналу:
- повідомлення рівня INFO для кожного HTTP-запиту зі статусом
<400 - повідомлення рівня WARN для кожного HTTP-запиту зі статусом від
400до499, включаючи повідомлення, яке буде надіслано в результаті JSON - повідомлення рівня ERROR для кожного HTTP-запиту зі статусом вище
499 - якщо встановлено необовʼязковий атрибут
player, повідомлення рівня DEBUG, яке виводить значенняplayerта отримане число - якщо необовʼязковий атрибут
playerне встановлено, повідомлення рівня DEBUG, яке виводить статичне значенняanonymous playerта згенероване число. Рядки журналу будуть використані для додавання мосту журналу під час інструментування, щоб продемонструвати, як OpenTelemetry може підключатися до наявних фреймворків журналювання.
- повідомлення рівня INFO для кожного HTTP-запиту зі статусом
- Код застосунку повинен бути розділений на два файли:
- файл
app, що містить обробку HTTP-запитів; - файл
library, що містить реалізацію функції кидання кубика. Назви цих файлів повинні бути ідіоматичними для мови реалізації, наприкладapp.jsіroll-the-dice.js. Важливим моментом є те, що завдяки розділенню коду файли демонструють, щоlibraryзалежить тільки від API, а весь код SDK ініціалізується в кодіapp.
- файл
- Обробка помилок для
rollsповинна бути розділена наступним чином:appперевіряє, чи визначеноrolls, і якщо ні, то встановлює його значення1.appперевіряє тільки, чиrollsє числом. Якщо так, то викликає функцію для кидання кубика вlibrary. Якщо ні, то виконує обробку помилки з помилкою400.libraryперевіряє, чиrollsє додатним числом. Якщо ні, то генерує помилку.appвиявляє помилку і відправляє назад помилку500.
libraryповинна мати зовнішню функцію, яка виконує обробку помилок, як описано вище. Потім зовнішня функція виконує наступні дії залежно від значенняrolls:rolls == 1: Виконати внутрішню функцію один раз і повернути значення.rolls > 1: Виконати цикл, який викликає внутрішню функціюrollsразів і повернути результати в масиві.
- Внутрішня функція
libraryстворює випадкове число від 1 до 6 і повертає це значення.
Вимоги до інструментування
- За можливості, ініціалізація для OpenTelemetry SDK повинна міститися в окремому файлі та імпортуватися в файл
app. В іншому випадку вона повинна бути частиною файлуapp. - Загальні детектори ресурсів повинні завантажуватися під час ініціалізації, наприклад для
process,container,os, … - Файл “lib” повинен залежати тільки від API OpenTelemetry.
- Атрибути
service.*повинні бути додані через змінні середовища (OTEL_SERVICE_NAME,OTEL_RESOURCE_ATTRIBUTES). - Інші
resource detectorsповинні бути додані до ініціалізації SDK. - Для експорту телеметрії застосунок повинен використовувати експортер для
stdout/consoleтаotlp. - Повинна бути опція для увімкнення діагностичного логування для компонентів OpenTelemetry, якщо це реалізовано, ідеально через
OTEL_LOG_LEVEL. - Повинна бути можливість додати бібліотеку інструментування для використовуваної бібліотеки HTTP. Ця бібліотека інструментування повинна використовувати стабільні семантичні домовленості для HTTP. Віддайте перевагу бібліотеці, яка охоплює більшість сигналів, ідеально, якщо вона має трейси та метрики.
- Якщо бібліотека інструментування недоступна, тільки тоді функція в
app, яка обробляє точку доступу/rolldice, інструментується користувачем шляхом додавання відрізку та метрик. - Повинен бути міст для логу для використовуваного механізму логування, щоб усі журнали автоматично збиралися та експортувалися.
- Для зовнішньої функції в
libraryповинен бути створений відрізок. Відрізок відстежує час роботи функції. Він записує помилку, якщо вона виникає. Він додає атрибути до відрізку, такі як значенняrolls,code.*, … - Для внутрішньої функції в
libraryповинен бути створений відрізок. Відрізок відстежує час роботи функції. Він додає випадкове число, яке він згенерував, як атрибут до відрізку. - У файлі
libraryповинні бути створені наступні метрики:- лічильник викликів зовнішньої функції
- гістограма розподілу результатів (1-6)
- індикатор останнього значення
rolls
Відгук
Чи це було корисним?
Дякуємо. Ми цінуємо ваші відгуки!
Будь ласка, дайте нам знати як ми можемо покращити цю сторінку. Ми цінуємо ваші відгуки!