- убраны клиент бота, транспорт обновлений, отправитель сообщений, сборка входа при старте, секция настроек и зависимость go-telegram-bot-api; из конвейера ушла доставка ответа отправителю — исход виден опросом готовности. Колонки адресата и значение источника остались в схеме: применённые шаги не переписываются - шаг 202608140003 запрещает пустого владельца у аудиозаписи и у файла; существующие строки он не проверяет, и это принято сознательно — искать их надо запросом до выкладки - ревью нашло два пред-существующих дефекта, оба закрыты: пустой второй ответ распознавателя стирал сохранённую расшифровку, а пустая расшифровка перестала быть заметной вместе с убранной доставкой. Попутно поднят golang.org/x/image до v0.45.0 — красный шаг vulns, воспроизводился и на чистом master
68 lines
3.4 KiB
Go
68 lines
3.4 KiB
Go
package metrics
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
// OtherFormatLabel — значение метки для всего, чего нет в перечне known-форматов.
|
|
const OtherFormatLabel = "other"
|
|
|
|
// knownFormats — закрытый перечень расширений, которые допускаются меткой.
|
|
//
|
|
// Состав: форматы, доезжающие приёмом по HTTP, плюс собственное умолчание
|
|
// сервиса на случай имени без расширения. Значения `oga` и `mp4` достались от
|
|
// убранного входа Telegram — голосовое приходило оттуда как `voice/file_N.oga`,
|
|
// кружок с `.mp4`, — и остаются: перечень сужает **метку**, а не приём, и
|
|
// выброшенное из него значение уронило бы прежние записи в `other`.
|
|
var knownFormats = map[string]struct{}{
|
|
"mp3": {},
|
|
"wav": {},
|
|
"ogg": {},
|
|
"oga": {},
|
|
"opus": {},
|
|
"flac": {},
|
|
"m4a": {},
|
|
"aac": {},
|
|
"wma": {},
|
|
"mp4": {},
|
|
"mkv": {},
|
|
"mov": {},
|
|
"avi": {},
|
|
"webm": {},
|
|
"audio": {}, // умолчание сервиса, когда расширения в имени не было
|
|
}
|
|
|
|
// FormatLabel приводит расширение к виду, годному для метки метрики.
|
|
//
|
|
// Расширение приходит из имени, которое дал отправитель, и потому может быть
|
|
// чем угодно: имя `запись.тайное-слово` отдаёт `тайное-слово`. Страница метрик
|
|
// открыта, то есть метка — поверхность пошире журнала. Незнакомое значение
|
|
// заменяется одним общим: это закрывает и утечку куска имени, и рост числа
|
|
// временных рядов, которым иначе распоряжается анонимный отправитель.
|
|
//
|
|
// Имени файла на диске это не касается — там расширение остаётся пришедшим.
|
|
// ObserveInputFileSize записывает размер принятой записи. Расширение приводится
|
|
// здесь, а не у вызывающего: сырая точка употребления — это место, где хвост
|
|
// имени отправителя однажды снова уедет наружу, и проверка у вызывающего этого
|
|
// не заметит.
|
|
func ObserveInputFileSize(ext string, size int64) {
|
|
InputFileSizeHistogram.WithLabelValues(FormatLabel(ext)).Observe(float64(size))
|
|
}
|
|
|
|
// ObserveConversionDuration записывает длительность конвертации. Исходный формат
|
|
// приводится по той же причине, что и в приёме.
|
|
func ObserveConversionDuration(srcExt, targetFormat string, failed bool, seconds float64) {
|
|
ConversionDurationHistogram.
|
|
WithLabelValues(FormatLabel(srcExt), targetFormat, strconv.FormatBool(failed)).
|
|
Observe(seconds)
|
|
}
|
|
|
|
func FormatLabel(ext string) string {
|
|
normalized := strings.ToLower(strings.TrimPrefix(ext, "."))
|
|
if _, ok := knownFormats[normalized]; ok {
|
|
return normalized
|
|
}
|
|
return OtherFormatLabel
|
|
}
|