{% extends layout %}{% import 'ui/kit.html' as kit %} {% import 'ui/telemetry/_t.html' as t with context %} {% block title %}Logs ยท amebo{% endblock %} {% block content %} {{ t.css() }} {%- set total = totals.values()|sum %} {%- set errors = totals.get('error', 0) + totals.get('fatal', 0) %}

Logs

Every line your services emitted, correlated to the trace that produced it. A line carrying a trace id links straight to its waterfall, and from there to the business event that started the whole thing.

{{ t.rng('/logs', w.key, {'s': service, 'sev': severity, 'q': q}) }}
Lines{{ w.label }}
{{ total }}
counted at ingest, not scanned
Errors and fatals
{{ errors }}
in this window
Showing
{{ lines|length }}
newest first, capped
Services
{{ seen|length }}
reporting telemetry

Volume stacked by severity, from the per-minute counters

{%- set mx = ([1] + points|map(attribute='total')|list)|max %}
{{ mx }}0
{%- for p in points %}
{%- for sev in severities %}{% set n = p.by.get(sev, 0) %}{% if n %}{% endif %}{% endfor -%}
{%- endfor %}
{%- set ax = h.axis(points) %}
{{ ax[0] }}{{ ax[1] }}{{ ax[2] }}
{{ kit.search_svg() }}
{%- for sev in severities %} {%- set n = totals.get(sev, 0) %} {%- endfor %}
{%- if not lines %}

No log lines match

Send them with POST /v1/logs, either as stock OTLP protobuf from any OpenTelemetry SDK or as {"logs": [...]} JSON from anything that can curl.

{%- else %}
{% for l in lines %}{{ t.logrow(l, True) }}{% endfor %}
{%- endif %}
{% endblock %}