Класифікація метрик на основі запиту або відповіді
Корисно візуалізувати телеметрію на основі типу запитів і відповідей, які обробляють служби у вашій мережі. Наприклад, книготорговець відстежує кількість запитів на перегляд книг. Запит на перегляд книги має таку структуру:
GET /reviews/{review_id}
Підрахунок кількості запитів на перегляд повинен враховувати невизначений елемент review_id
. GET /reviews/1
, з наступним GET /reviews/2
слід рахувати як два запити на перегляд.
Istio дозволяє створювати правила класифікації за допомогою втулку AttributeGen, який групує запити в фіксовану кількість логічних операцій. Наприклад, ви можете створити операцію з назвою GetReviews
, що є поширеним способом ідентифікації операцій за допомогою Open API Spec operationId
. Ця інформація вставляється в обробку запитів як атрибут istio_operationId
зі значенням, що дорівнює GetReviews
. Ви можете використовувати цей атрибут як вимір у стандартних метриках Istio. Аналогічно, ви можете відстежувати метрики на основі інших операцій, таких як ListReviews
і CreateReviews
.
Класифікація метрик за запитом
Ви можете класифікувати запити на основі їх типу, наприклад, ListReview
, GetReview
, CreateReview
.
Створіть файл, наприклад
attribute_gen_service.yaml
, і збережіть його з таким вмістом. Це додає втулокistio.attributegen
. Також створюється атрибутistio_operationId
і заповнюється значеннями для категорій, які слід рахувати як метрики.Ця конфігурація є специфічною для конкретного сервісу, оскільки шляхи запитів зазвичай залежать від сервісу.
apiVersion: extensions.istio.io/v1alpha1 kind: WasmPlugin metadata: name: istio-attributegen-filter spec: selector: matchLabels: app: reviews url: https://storage.googleapis.com/istio-build/proxy/attributegen-359dcd3a19f109c50e97517fe6b1e2676e870c4d.wasm imagePullPolicy: Always phase: AUTHN pluginConfig: attributes: - output_attribute: "istio_operationId" match: - value: "ListReviews" condition: "request.url_path == '/reviews' && request.method == 'GET'" - value: "GetReview" condition: "request.url_path.matches('^/reviews/[[:alnum:]]*$') && request.method == 'GET'" - value: "CreateReview" condition: "request.url_path == '/reviews/' && request.method == 'POST'" --- apiVersion: telemetry.istio.io/v1 kind: Telemetry metadata: name: custom-tags spec: metrics: - overrides: - match: metric: REQUEST_COUNT mode: CLIENT_AND_SERVER tagOverrides: request_operation: value: istio_operationId providers: - name: prometheus
Застосуйте ваші зміни за допомогою наступної команди:
$ kubectl -n istio-system apply -f attribute_gen_service.yaml
Після того, як зміни наберуть чинності, відвідайте Prometheus і знайдіть нові або змінені вимірювання, наприклад,
istio_requests_total
у podʼахreviews
.
Класифікація метрик за відповіддю
Ви можете класифікувати відповіді, використовуючи подібний процес до запитів. Зверніть увагу, що вимір response_code
вже стандартно існує. У прикладі нижче змінюється спосіб його заповнення.
Створіть файл, наприклад
attribute_gen_service.yaml
, і збережіть його з таким вмістом. Це додає втулокistio.attributegen
і генерує атрибутistio_responseClass
, який використовується втулком статистики.У цьому прикладі класифікуються різні відповіді, наприклад, групування всіх кодів відповіді в діапазоні
200
як вимір2xx
.apiVersion: extensions.istio.io/v1alpha1 kind: WasmPlugin metadata: name: istio-attributegen-filter spec: selector: matchLabels: app: productpage url: https://storage.googleapis.com/istio-build/proxy/attributegen-359dcd3a19f109c50e97517fe6b1e2676e870c4d.wasm imagePullPolicy: Always phase: AUTHN pluginConfig: attributes: - output_attribute: istio_responseClass match: - value: 2xx condition: response.code >= 200 && response.code <= 299 - value: 3xx condition: response.code >= 300 && response.code <= 399 - value: "404" condition: response.code == 404 - value: "429" condition: response.code == 429 - value: "503" condition: response.code == 503 - value: 5xx condition: response.code >= 500 && response.code <= 599 - value: 4xx condition: response.code >= 400 && response.code <= 499 --- apiVersion: telemetry.istio.io/v1 kind: Telemetry metadata: name: custom-tags spec: metrics: - overrides: - match: metric: REQUEST_COUNT mode: CLIENT_AND_SERVER tagOverrides: response_code: value: istio_responseClass providers: - name: prometheus
Застосуйте ваші зміни за допомогою наступної команди:
$ kubectl -n istio-system apply -f attribute_gen_service.yaml
Перевірка результатів
Генеруйте метрики, надсилаючи трафік до вашого застосунку.
Відвідайте Prometheus і знайдіть нові або змінені вимірювання, наприклад,
2xx
. Альтернативно, використовуйте наступну команду, щоб перевірити, що Istio генерує дані для вашого нового вимірювання:$ kubectl exec pod-name -c istio-proxy -- curl -sS 'localhost:15000/stats/prometheus' | grep istio_
У виході знайдіть метрику (наприклад,
istio_requests_total
) і перевірте наявність нового або зміненого вимірювання.
Усунення неполадок
Якщо класифікація не відбувається, як очікувалося, перевірте наступні потенційні причини та рішення.
Перегляньте журнали проксі Envoy для podʼа, на якому застосовано зміни конфігурації служби. Переконайтеся, що немає помилок, про які повідомляє служба в журналах проксі Envoy у pod (pod-name
), де ви налаштували класифікацію, використовуючи наступну команду:
$ kubectl logs pod-name -c istio-proxy | grep -e "Config Error" -e "envoy wasm"
Крім того, переконайтеся, що немає крахів проксі Envoy, шукаючи ознаки перезапусків у виході наступної команди:
$ kubectl get pods pod-name
Очищення
Видаліть файл конфігурації YAML.
$ kubectl -n istio-system delete -f attribute_gen_service.yaml