имя файла отправителя убрано из журнала приёма
- расширение приводится к перечню известных форматов прежде метки метрики: страница метрик открыта, и хвост имени уезжал на неё дословно - проверки приёма перехватывают все три потока журнала и читают реестр метрик, каждая падает при снятии того, что сторожит
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
package metrics
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// OtherFormatLabel — значение метки для всего, чего нет в перечне known-форматов.
|
||||
const OtherFormatLabel = "other"
|
||||
|
||||
// knownFormats — закрытый перечень расширений, которые допускаются меткой.
|
||||
//
|
||||
// Состав: пути, которые выдаёт Telegram (голосовое приходит как
|
||||
// `voice/file_N.oga`, кружок — с `.mp4`), плюс форматы, доезжающие приёмом по
|
||||
// HTTP, плюс собственное умолчание сервиса на случай имени без расширения.
|
||||
// Списку, по которому бот отбирает **документы** (`isAudioDocument`), перечень
|
||||
// намеренно не равен: тот судит по типу содержимого и своим списком пользуется
|
||||
// лишь когда типа нет, а сюда попадает и то, что приходит другими путями.
|
||||
// Сведение двух списков в один уронило бы основной вход сервиса в `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
|
||||
}
|
||||
Reference in New Issue
Block a user