Java

Логи и корреляция: структурные логи, trace_id и Loki

Логи и корреляция: структурные логи, trace_id и Loki

Структурный лог и коррелируемый лог — не одно и то же: в Go trace_id в stdout приходится добавлять руками, в Java его кладёт агент. Разбираем модель Loki, замеряем последствия высокой кардинальности (2 стрима против 1202), выясняем, почему на OTLP-логах не работает привычный json-парсер, и ловим ошибку корреляции, которая проявляется у каждого шестнадцатого трейса.

Распределённый трейсинг end-to-end: контекст через HTTP, БД и брокеры

Распределённый трейсинг end-to-end: контекст через HTTP, БД и брокеры

Распределённый трейсинг держится на одном: контекст должен пережить каждую границу. Разбираем W3C trace context дословно с провода, проброс через HTTP, PostgreSQL и NATS, два воспроизводимых разрыва трейса, head- и tail-семплинг с фактическими долями и две ловушки TraceQL, которые дают правдоподобные неверные числа.

Picodata и PostgreSQL: где кончается совместимость

Picodata и PostgreSQL: где кончается совместимость

PostgreSQL-протокол — основной способ работы с Picodata: psql, pgx и psycopg подключаются к ней тем же кодом, что к PostgreSQL. Но совместимость частичная, и граница проходит не там, где ожидаешь. Живая матрица пяти клиентов против 59 SQL-конструкций, поведение pg_dump и мигратора, и почему у Picodata собственный JDBC-драйвер

Инструментирование OpenTelemetry в Go и Java: traces, metrics, logs

Инструментирование OpenTelemetry в Go и Java: traces, metrics, logs

Как инструментировать сервисы через OpenTelemetry: разделение SDK и API, три сигнала, auto- и manual-инструментализация, spans и context propagation, экспорт в Collector по OTLP. Практика на Go (SDK + slog-bridge) и Java (OTel-агент), с замерами накладных расходов на живом стенде.

Профилирование в разных языках: как измерять без самообмана

Профилирование в разных языках: как измерять без самообмана

Один и тот же вопрос — где на самом деле уходит время и память — в Go, Java, C++, C#, Python и Node: sampling против instrumentation, CPU/alloc/heap-профили, флеймграфы, микробенчмарки без самообмана и как из профиля сделать вывод

Куча, стек и сборщик мусора: как языки управляют памятью

Куча, стек и сборщик мусора: как языки управляют памятью

Как C++, Rust, Go и Java решают один и тот же вопрос — кто и когда освобождает память: вручную, детерминированно по владению (корректность проверяет компилятор) или в рантайме через сборщик мусора. Стек против кучи, стоимость аллокации, паузы сборщика, утечки и фрагментация — и на что смотреть под свою нагрузку

Aerospike и Apache Ignite: масштаб и грид

Aerospike и Apache Ignite: масштаб и грид

Две системы для масштаба: Aerospike с гибридной архитектурой памяти (индекс в DRAM по умолчанию, данные в RAM или на flash) — и живая цена индекса в байтах; и Apache Ignite как in-memory data grid + compute grid, где вычисление едет к данным через affinity colocation, а экономия сети измеряется в объектах

Горутины, корутины, потоки: модели конкурентности в разных языках

Горутины, корутины, потоки: модели конкурентности в разных языках

Как C++, Go, Rust, Java, Python и Node решают один вопрос — как исполнять независимую работу параллельно с чужими стеками и планировщиками: потоки ОС, green/virtual threads, stackless-корутины и event loop. Вытеснение против кооперации, stackful против stackless, 1:1 против M:N — и чем каждая модель платит

Дженерики, шаблоны, erasure: параметрический полиморфизм в разных языках

Дженерики, шаблоны, erasure: параметрический полиморфизм в разных языках

Один вопрос — как написать код, работающий для многих типов, без дублирования — языки решают принципиально по-разному: мономорфизация (C++, Rust), стирание типов (Java), гибрид GC-shape stenciling (Go), реификация (C#). За синтаксисом стоит выбор компилятора, и он даёт измеримые последствия по скорости, размеру бинаря и выразительности