Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 512новых вакансий за сутки·54 396вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 565
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 395 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python8 752
  • Облачные технологии6 631
  • QA вакансии2 183
  • Android1 322
  • Инженер данных860
  • Продакт-менеджер316

Разработка

  • iOS1 238
  • Backend вакансии1 196
  • AI вакансии549
  • Fullstack вакансии500
  • Frontend вакансии426
  • Mobile вакансии28

По стеку

  • Go5 209
  • Java3 131
  • Kotlin1 113
  • Node.js1 008
  • Rust833
  • .NET656
  • PHP322
  • C++270
  • C#207

DevOps и инфраструктура

  • Kubernetes3 882
  • Linux-инфраструктура2 817
  • DevOps вакансии2 655
  • Terraform / IaC2 191
  • Мониторинг и Observability1 071
  • CI/CD919
  • SRE308
  • Кибербезопасность38

Аналитика и данные

  • Аналитик данных522
  • Data Scientist435
  • Бизнес-аналитик397
  • Системный аналитик67

Другие направления

  • Проджект-менеджер109
  • UI/UX дизайн67
  • Ручное тестирование14

По регионам

  • Вакансии в США22 951
  • Вакансии в Европе10 259
  • Работа в России2 963
  • Вакансии в Канаде2 034

По формату

  • Удалённые вакансии39 691
  • Релокация в США22 951
  • Гибридная работа3 633
  • Офисная работа2 761

По уровню

  • Senior вакансии19 599
  • Middle вакансии11 130
  • Junior вакансии3 562

Сейчас нанимают

Все компании
  • Wise192 вакансии
  • Rakuten189 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Celonis42 вакансии
  • Spotify37 вакансий
  • Adyen28 вакансий
  • Infobip28 вакансий
  • Monzo20 вакансий
  • Darktrace17 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме KtorВсе вопросы
KtorSeniorПроектирование систем

Как проектировать observability в Ktor: structured logs, request id, metrics и tracing?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Observability в Ktor строится из трёх компонентов: структурные логи через Logback + MDC с requestId, метрики через MicrometerMetrics + Prometheus, и трейсинг через OpenTelemetry SDK с авто-инструментацией Ktor.

Структурные логи с Request ID

Используйте SLF4J + Logback с JSON-энкодером (например, logstash-logback-encoder) и кладите requestId в MDC для корреляции:

// build.gradle.kts
dependencies {
    implementation("io.ktor:ktor-server-call-logging-jvm:2.3.11")
    implementation("net.logstash.logback:logstash-logback-encoder:7.4")
}
// logback.xml
<configuration>
  <appender name="JSON" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
      <includeMdcKeyName>requestId</includeMdcKeyName>
      <includeMdcKeyName>userId</includeMdcKeyName>
    </encoder>
  </appender>
  <root level="INFO">
    <appender-ref ref="JSON"/>
  </root>
</configuration>
// Application.kt
install(CallLogging) {
    level = Level.INFO
    mdc("requestId") { call ->
        call.request.header("X-Request-Id") ?: UUID.randomUUID().toString()
    }
    mdc("userId") { call ->
        call.principal<JWTPrincipal>()?.payload?.getClaim("sub")?.asString()
    }
    format { call ->
        val duration = call.processingTimeMillis()
        "${call.request.httpMethod.value} ${call.request.uri} " +
        "-> ${call.response.status()} in ${duration}ms"
    }
}

Observability в Ktor: logs, metrics, tracing

Метрики через Micrometer + Prometheus

dependencies {
    implementation("io.ktor:ktor-server-metrics-micrometer-jvm:2.3.11")
    implementation("io.micrometer:micrometer-registry-prometheus:1.12.5")
}
val prometheusRegistry = PrometheusMeterRegistry(PrometheusConfig.DEFAULT)

install(MicrometerMetrics) {
    registry = prometheusRegistry
    distributionStatisticConfig = DistributionStatisticConfig.Builder()
        .percentilesHistogram(true)
        .percentiles(0.5, 0.95, 0.99)
        .build()
    // Кастомные теги для всех метрик
    meterBinders = listOf(
        ClassLoaderMetrics(),
        JvmMemoryMetrics(),
        JvmGcMetrics(),
        ProcessorMetrics()
    )
}

// Prometheus scrape endpoint
routing {
    get("/metrics") {
        call.respondText(prometheusRegistry.scrape(), ContentType.Text.Plain)
    }
}

Distributed Tracing через OpenTelemetry

dependencies {
    implementation("io.opentelemetry:opentelemetry-api:1.38.0")
    implementation("io.opentelemetry:opentelemetry-sdk:1.38.0")
    implementation("io.opentelemetry:opentelemetry-exporter-otlp:1.38.0")
    implementation("io.opentelemetry.instrumentation:opentelemetry-ktor-2.0:2.4.0-alpha")
}
val tracer: Tracer = GlobalOpenTelemetry.getTracer("ktor-app")

// Плагин для Ktor — автоматическая инструментация входящих запросов
install(KtorServerTelemetry) {
    setOpenTelemetry(GlobalOpenTelemetry.get())
}

// Ручная инструментация бизнес-логики
suspend fun UserService.getById(id: String): User {
    val span = tracer.spanBuilder("UserService.getById")
        .setAttribute("user.id", id)
        .startSpan()
    return span.makeCurrent().use {
        try {
            repository.findById(id)
        } catch (e: Exception) {
            span.recordException(e)
            span.setStatus(StatusCode.ERROR)
            throw e
        } finally {
            span.end()
        }
    }
}

Health check эндпоинты

routing {
    get("/health/live") {
        call.respond(HttpStatusCode.OK, mapOf("status" to "UP"))
    }
    get("/health/ready") {
        val dbOk = runCatching { dataSource.connection.close() }.isSuccess
        val status = if (dbOk) HttpStatusCode.OK else HttpStatusCode.ServiceUnavailable
        call.respond(status, mapOf("db" to dbOk))
    }
}

Подводные камни

  • MDC в coroutine теряется при переключении контекста — используйте MDCContext() из kotlinx-coroutines-slf4j: withContext(Dispatchers.IO + MDCContext()) { ... }.
  • Метрики за /metrics без auth доступны всем — закрывайте эндпоинт через network policy или Basic Auth.
  • Prometheus scrape по умолчанию каждые 15 секунд — слишком редко для SLO P99 под нагрузкой; снижайте до 5 секунд.
  • OpenTelemetry Java agent (javaagent JAR) конфликтует с ручной инструментацией — выбирайте один подход.
  • Logback async appender (AsyncAppender) может терять последние логи при shutdown без includeCallerData=true и явного stop().
  • CallLogging не логирует тело запроса по умолчанию — добавляйте только для debug и с ограничением размера.
  • Гистограммы Micrometer percentilesHistogram(true) создают много временных рядов — согласуйте с командой ops.
  • Span ID не пробрасывается в Logback автоматически — нужна явная интеграция через OpenTelemetryAppender.

Частые вопросы на собеседовании

  • Какие security-риски возникают в Ktor при CORS, JWT/session auth и обработке multipart-загрузок?
  • Каковы варианты production-деплоя приложения Ktor?
  • Как определять маршруты (routes) в Ktor и как работает вложенная маршрутизация?
  • Что такое plugins (ранее features) в Ktor и как их устанавливать?

Типичные ошибки

  • Отвечать определением без production-сценария.
  • Не называть runtime boundary, security boundary или failure mode.
  • Игнорировать версию API, observability и тестовую проверку.

Что проверяет интервьюер

  • Объясняет механизм своими словами и без выдуманных API.
  • Называет реальные риски, диагностику и критерий корректности.
  • Связывает ответ с текущей документацией и миграционными ограничениями.

Как вы знаете этот вопрос?

Проверить себя по теме Ktor →

Источники

  • https://ktor.io/docs/server-deployment.html
←Предыдущий вопросКак корректно делать graceful shutdown Ktor-приложения и закрывать внешние ресурсы?Следующий вопрос→Проект на Ktor вырос из MVP в большой production-сервис. Какие проблемы архитектуры и сопровождения вы ожидаете увидеть?

Связанные темы

Ktorktorktor-productionrisk-analysistechnical-depth