Make. Build. Break. Reflect.
909 subscribers
115 photos
1 video
119 links
Полезные советы, всратые истории, странные шутки и заметки на полях от @kruchkov_alexandr
Download Telegram
Почта будет выглядеть так, как вы этого захотите, тут пример с тем же html шаблоном, в котором есть все частые переменные, нужные для детекции проблем. Пилите его сами для себя.
👍1
#alertmanager #troubleshooting

Сижу никого не трогаю.
Прилетает алёрт - превышение IOPS для MongoDB в K8s кластере.
Алёрт и метрики я писал сам, стало интересно, а чо прям можно упереться в максимум премиум ссд, вы там, бл, майните что-ли?
(на самом деле ссыканул, думал моя арифметика сбоит и алёрт фейк говно).

Не, прям по метрикам графаны - IOPS PV высокий.
Захожу в другие графики - read/write на PVC прям высокий.
То есть и IOPS и read/write был на нуле почти, а теперь в сотни тысячи раз выше.

Посмотрел по последним релизам - да, сутки назад был релиз и после этого начало гореть.
Пишу qa, pm - спрашиваю ожидаемая нагрузка, они говорят что нет. Да и вообще релиз прошёл, там нет ничего, ты чо.
Все вертят головой, говорят это я дурачок,у них всё ок.

* Сделаем ремарку и я уточню, что про монгодб я знаю лишь общее описание что это и всё.
Ну практического опыта у меня нет. Могу установить, могу дать креды и закрыть сеткой приватной и.. и пожалуй всё.
В общем начал я читать про базы данных, коллекции, операции, нагрузку.
Потом начал читать про репликацию в кластере, может это остаток репликации после апдейта.
Короче алёрт горит, а я всё читаю и читаю.
В итоге при помощи документации и великолепнейшего и любимого мной теперь DataGrip подключаюсь к базе(креды взял в секрете кубера, а порт прокинул через портфорвард, экстернал ендпойнта не было).
Посмотрел на базы, на коллекции, поигрался с запросами. Поспрашивал про типичные команды у нейронок.
В общем выяснил то, что
- размер с индексами 1.5гигабайта
- в новой версии софта у нас есть запросы с collscan

То есть делается обычный запрос - у нас перечитывается ВСЯ коллекция в 1.5Gb, делается обычный запрос - у нас перечитывается ВСЯ коллекция в 1.5Gb и так по циклу.
Сумасшедшее ридрайд насилие над стораджем.
Выяснил я это всё сам, не имея раньше дел с монгой в кишках.

Пишу девелоперам про свои находки, они уходят в запой на паузу и возвращаются через сутки🤣с ответом:
"в коллекции XXXX есть поля _id и accountId, которые суть одно и то же, но по accountId нет индекса. у нас появился запрос, который использует второе поле, поэтому сканится вся коллекция".😢

Пилят фикс, и в следующем релиза это катнём.
И да, пока приложение насилует диск монги.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍103🌚1
Какие выводы? А они прям капитаночевидные👍:
- если у вас есть сервера, которые вы разворачиваете, хотя бы почитайте базовые команды для траблшутинга и сохраните в блокнотик. в случае инцидента не надо тратить время на чтение "что за говно у нас тут и как/куда тут смотреть чо"
- алёрты нужны не только на IOPS (спасибо мне, сладкому), но и на высокий/аномальный read/write. Надо будет закинуть в беклог
- какое счастье, что у нас не SAAS Mongo, иначе нам сожрало бы весь бюджет на ближайшие 50000 лет, выкатив прайс на $100.000 за эти сутки
- разработчики мудаки айти проклято, подстава откуда не ожидаешь
- azure врунькают, у них IOPS выше их трешхолдов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
"хей Алекс, у нас закончилась демо версия Backup radar, теперь они хотят денег. Сможешь сделать аналог на AWS? Но денег и часов на задачу на один час. Нам просто надо ежедневно получать уведомления, что у нас успешно создаются бекапы. Сами снепшоты/бекапы создаются".

Ну один час, так один час.
EventBridge в чистом виде неудобен, я дольше буду читать про типы сорсов и полей, занимаясь фильтрацией.

1) Используем популярный модуль ИЛИ пилим те же ресурсы в чистом терраформе.
Выбор каждого.
- пример с модулем
module "aws-backup-notifications" {
source = "terraform-aws-modules/notify-slack/aws"
version = "6.5.1"
sns_topic_name = "aws-backup-notifications"
recreate_missing_package = false
slack_webhook_url = data.sops_file.sops_file.data.slack-webhook-aws-backup-notifications.url"]
slack_channel = "aws-backup-daily-notifications"
lambda_function_name = "aws-backup-notifications"
slack_username = "AWS Health Event"
}

- пример без модуля будет нечто типа того (в попытке обезличить мог чушь написать, но на то он и пример).
https://gist.github.com/kruchkov-alexandr/e9139d60658175a5a91c186bd7e0f6b3

Ок теперь у нас есть лямбда, роли, пермишны, SNS топик.
При отправке мессаджа в SNS лямбда отправляет сообщение с метаданными в Slack.

2) Теперь нам надо научиться подписываться на события:
# RDS and DocumentDB cluster snapshot events

resource "aws_db_event_subscription" "db_snapshot_events" {
name = "aws-backup-notifications"
sns_topic = "arn:aws:sns:us-east-1:${data.aws_caller_identity.this.account_id}:aws-backup-notifications"
source_type = "db-cluster-snapshot"
event_categories = []
source_ids = []
enabled = true
}


Если нам надо ещё и по Redis, то в существующих ресурсах добавить
resource "aws_elasticache_replication_group" "this" {
...
notification_topic_arn = "arn:aws:sns:us-east-1:${data.aws_caller_identity.this.account_id}:aws-backup-notifications"
...
}


Ок, делаем вручную снепшот, видим мессаджи в Slack - задача выполнена.

4) Так, сообщение от Redis(ElastiCache) короткое и удобно читать в слаке, а вот через лямбду некрасивое и много лишней метаданных, давайте порежем лямбду...

oh wait, а час и закончился, сдаём как есть🤣.

Кому хочется красоты и лаконичности, тот знает прайс.

5) Не забываем напомнить заказчику не мьютить сразу новый слак канал #aws-backup-daily-notifications 😁

#aws
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7👍1
* для этой задачи для этих условий
Плюсы с модулем:
- 18 строчек кода
Минусы с модулем:
- мессадж гигантский, занимает половину экрана

Плюсы без модуля:
- можно сделать лямбду с минимальным мессаджем в слак
Минусы без модуля:
- ну в час не успеть
- много кода, либо пилить свой модуль

Не забывайте, что тут данная подписка на снепшоты кластера, на снепшоты инстансов это не распространяется.

Зачем замазывал event id я не знаю🤣

#aws
Please open Telegram to view this post
VIEW IN TELEGRAM
😍3👍2
Опять observability.

Признаюсь, за весь свой опыт работы с алёртингом я больше тратил время не на технические задачи.
Сделать сбор метрик, отсеять лишние, повесить алёрты и создать каналы слака/телеграма, забив их людьми и повесив дежурство это на самом деле не сложно.
Не сложно и напилить борды в графане и сделать линк до инцидента в самом алёрте.
Технические задачи решаются легче всего.

Самое сложное сперва было
- разобраться с severity levels
- сделать порядок (флоу?rule?) куда чего и как будет идти
- понять кто за что ответственен

Вот допустим мы говорим строго про инженеров платформы/инфраструктуры.
Чего мы хотим видеть в северити:
- info - информативные сообщения, которые скорее всего будут добавлены в канал оповещения с mute и лезть мы туда будем постфактум "а чо было". Например что джоба в кубере выполнялась больше 25 минут.
- warning - предупреждения, что скоро будет не ок. Например 80% заполнения диска на критикал инфре. Пока не проблема, но может стать проблемой в будущем.
- critical - ну тут понятно. Кластер упал, место закончилось, бизнес аппликейшн последние 3 минуты выдает 502 ошибки и всё легло.
Никаких вопросов тут не вызывало никогда у меня, ни развесить северити, ни определиться с каналом оповещения.

А что делать со сторонними сервисами?
Мы так много говорим про девопс, но не можем самим себе ответить на простые вопросы.
Например ArgoCD.
Куда отправлять алёрты такого плана?
argocd_app_info{health_status!="Healthy"} != 0
argocd_app_info{sync_status!="Synced"} != 0

Девелоперам? Инженерам инфры? А если не прод, а demo/UAT кластер?
Нужно ли это смотреть девопсам?
В общий канал про прод критикал инциденты или отдельный для арго?
Если для арго, то один общий на все енвы или под каждый стенд/енв/проект?

Ладно, допустим арго не самая сложная штука.
Мы мониторим Azure Enterprise application (+service principle credentials expire).
Вот в аппликейшн не заходили полгода. Куда писать, чтобы удалить эту неиспользуемую? Это ворнинг или инфо?
Если креды протухнут скоро кому писать? Опсы и девопсы вообще не в курсе что это за креды и где они могут использоваться.

Airflow. Упал DAG.
опять кому писать? о чем?
То, что там нет метода это не важно опсам, но нужно QA.
А если DAG упал, потому что на нодах, где запускаются воркеры нет ресурсов, то это уже инфровая часть.
Как их разделять если там нет привычного label фильтрации.
Нужно ли знать о том, что в проде упал даг или это простая фигня не важная?

Усложняем задачи.
У нас есть базы данных и deadlock. Кому писать?
А дедлок по факту свершения или есть их +5 за последние 5 минут?
Это критикал или ворнинг?

Ладно, trino. На UAT долго повис запрос и сожрал всю память, а остальные 56 запросов висят в очереди час.
(кстати это аффектит и Airflow и всё ETL)
Кому об этом писать и как?


Наверное пора прийти к какому-то шаблону для тех, кто приходит с новым алёртом.
Думаю о варианте типа:
- автор алёрта(команда/человек)
- expr/metric+threashold
- какой severity алёрта
- в какой канал уведомлять(почта/слак/телеграм/голуби)
- правило, если каналов несколько
Нет этой информации - нет и алёрта.
Эх, мечты мечты, придут ко мне срочно и всё равно и без заявки и без ответственного лупану алёрт в общий канал.🤣

То есть большую часть занимают размышление и правильный флоу, чем написание кода и конфигов.

Основная же стратегия пока примерно такая:
- у каждого алёрта есть обязательный severity, который назначается при создании алёрта
например
- alert: JobFailed
expr: kube_job_status_failed{} > 0
labels:
severity: info

- на всех метриках мы используем лейбл cluster(если он есть), либо обогащаем этим лейблом, если это не в кубере(например виртуальная машина)
- а затем через rules мы роутим в нужные каналы уведомлений согласно типа алёрта/кластера/имени алёрта/аутедж и так далее
- пример отобразил на графике

Это не финальный результат, наверняка буду менять не единожды, но это уже работает и большинство коллег устраивает.

#observability #alertmanager
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥21
This media is not supported in your browser
VIEW IN TELEGRAM
#пятница

Мемы, а кто не любит мемы.
Но бывает такое, что наши дружочки-пирожочки не пользуются теми соцсетями, в которых сидим мы.
Где-то заблокирован фейсбук, где-то недостаточно снижена скорость ютуба, а где-то и нет у подруги тиктока, "потому что там все тупые".
Просто ссылки присылать неудобно, а смешным/классным/мотивирующим видео иногда хочется поделиться.
Но ведь всегда же можно просто прислать само видео!

Лучшая платформа для "вставив ссылку на инстаграм/тикток/инстаграм/фейсбук, скачалось видео/изображение".
Без рекламы, без капчи, без регистрации, без тупых баннеров, бесплатно, быстро.

https://cobalt.tools/
👍53
"хей, у нас что-то с сервисом на проде, сможешь потраблшутить? Потом обсудим бюджет и оплату часов, сейчас надо понять что не так у нас. Что-то с SQS, очереди растут"

Ну пока супруга не видит, что работаю в выходные, пойду гляну🤣

Первым делом вижу, что всё так, очередь растёт и никто не читает.
https://1drv.ms/i/s!AhrWCTJApEtgjL9P66anxphCc0XgYA?e=Ie8O1F
Идём по конфигам смотреть кто должен читать очередь.
Ага, POD с именем webhook-*.
Смотрим сколько их
>k get pods | grep webhook | wc -l
50

Ок, а сколько у нас в HPA/KEDA
>ky hpa webhook |grep -A1 -i maxre
maxReplicas: 50

Ага, упёрлись в максимум. А чо у нас триггер? Раз тут HPA, а не KEDA, то значит ресурсы, а не количество мессаджей.
>ky hpawebhook | grep -A6 -i metrics
metrics:
- resource:
name: cpu
target:
averageUtilization: 85
type: Utilization

В любом случае не важно что триггер - реплик итак уже 50. Всё, максимум.

Ок, что делает данный сервис, смотрим по коду:
- поллит sqs очередь, процессит и отправляет в RDS какие-то апдейты
Судя по значению в переменной ендпойнта - подключение идёт через RDS proxy (фу, опять он), это видно по названию.
Смотрим настройки RDS max connection - default по типу инстанс тайпу.
Смотрит настройки прокси, ничего необычного.
resource "aws_db_proxy_default_target_group" "this" {
db_proxy_name = aws_db_proxy.rds_proxy.name
connection_pool_config {
connection_borrow_timeout = 120
max_connections_percent = 80
max_idle_connections_percent = 20
}
}

Хм. смотрим нагрузку БД - всё ок.
https://1drv.ms/i/s!AhrWCTJApEtgjL9RXf8WRAW5oWUVyA?e=imAk16
Ничего сверхъестественного.

Первая мысль - а давай лупану hpa max replicas 100 вместо 50!! 🦍
Ну конечно же эту мысль сразу отбросил, так как х2 увеличение клиентов может банально положить базу. Там же какие инсёрты есть.
Да и странно это вообще выглядит - 50 подов не могу обработать какое-то вшивое количество сообщений(на момент траблутинга всего 151.000)?
Там не рокетсайнс, просто процессинг мессаджа и всё, алё.

Ок, давайте смотреть что на прокси.
https://1drv.ms/i/s!AhrWCTJApEtgjL9TS18jflKYNPp8_w?e=58iUjv
А там чётко всё.

Так давай пойдём считать настройки laravel horizon:
- тайауты айдл
- количество воркеров
- количество подов
- какой поллинг тайм
и так далее, в коде и настройках самого сервиса и гите.

Тут крик супруги ТЫ ТАМ ЧО ОПЯТЬ РАБОТАЕШЬ ЧТО-ЛИ????

Тактически перекатываюсь в другой экран windows ДА Я ТУТ ПАШКОВСКОГО СМОТРЮ, У НЕГО ВТОРОЙ ВЫПУСК ИЗ КУБЫ)))НУ ТЫ ЧО))
и начинаю думать судорожнее, да что не так то, давай без арифметики.
А может быть такое, что 50 подов со своими воркерами тупо заняли весь пул(на них выделенный) и им просто не хватает?
Ну тогда быстро решений несколько:
- увеличить количество max_connections_percent
- уменьшить connection_borrow_timeout
- увеличить количество maxreplicas HPA (но это теоретически может положить базу)
- семь бед один ресет

Перекатываюсь обратно и быстро грохаю все поды, а чо вы мне сделаете
>k delete pod -l=app=webhook

И та-дам!
Видим, что сбросив пулл на прокси мы практически мгновенно начинаем вычитывать очередь.
https://1drv.ms/i/s!AhrWCTJApEtgjL9Vyy6q2lsEK_AQwA?e=65qTxE
https://1drv.ms/i/s!AhrWCTJApEtgjL9X7WSdHh45PrU2-g?e=DGjEHi

Итог:
- а чего было не знаю, надо в арифметику в будние дни смотреть, наверняка в воркерах ошибка и там на условные 10 читки идёт 5 коннекшнов и оно просто херово сконфигурено
- иногда рестарт ок, если не персистент дата
- меня так и не спалили, что работал 🤣
- вообще надо бы проверить сколько max k8s clusters - чтобы не упёрлись в пределы
- вообще все sqs-related PODs надо перетащить на KEDA + trigger
О примерном конфиге я писал в другом чате https://xn--r1a.website/kubernetes_ru/875330

Трекаешь 2 часа😂
Можно идти дальше Пашковского смотреть.

#aws #troubleshooting #одинденьизжизни
Please open Telegram to view this post
VIEW IN TELEGRAM
😁5👍31
Мои подписчики часто спрашивают меня
Господи, надеюсь я никогда не буду нести чушь инфоцыганщины🤣

Иногда я буду писать про свою продуктивность.
Это могут быть технические советы уровня junior после курсов, а могут быть крайне высокоуровневые штуки, которые могут не пригодится никому ещё долгое время. Если вы всё знаете и умеете, то просто скипайте.

Начнём с самого простого. Настройка рабочего места.
Я часто могу пересаживаться с рабочего Windows стационарного ПК на surface планшет и потом и вовсе на макбук.
Мне надо иметь всегда идентичное рабочее место и утилиты, как минимум консольные, и алиасы.

У меня через MS OneDrive (подписка MS office 365 family, ныне AI MS AI COPILOT AI 365 AI🤣) идет синхронизация всех важных мне файлов:
- ~/.bashrc файла
В нём всякие alias, кастомизации prompt и многое важное
- ~/.gitconfig настройки GIT
- ~/.ssh/config настройки SSH (например там у меня сетапы для jumphosts)
- ~/.cargo/config.toml настройки растоёба для RUST
Так же не маловажно отдельно выделю ASDF пакетный менеджер.
- ~/.tool-versions список утилит и их версий
- ~/.asdfrc собственно сам конфиг asdf
- ~/.asdf/plugins/ ТОЛЬКО для кастомных плагинов, у меня их всего 3

Для тех, кто незнаком с пакетными менеджерами, а всё ещё пользуется скачиванием бинарей с гитхаба.
- установил asdf один раз
https://github.com/asdf-vm/asdf/releases
- установил нужные плагины один раз
asdf plugin add golang
asdf plugin add nodejs
asdf plugin add python
asdf plugin add helm
asdf plugin add kubectl
asdf plugin add k9s
asdf plugin add flux
asdf plugin add terraform

- Создаём .tool-versions (один раз, потом иногда обновляем)
golang 1.22.0 1.21.6
nodejs 20.11.0 18.19.0
python 3.12.1 3.11.7
helm 3.14.0 3.13.3
terraform 1.7.2 1.6.6
kubectl 1.29.1 1.28.4
k9s 0.31.7 0.31.6
flux 2.2.3 2.1.2

- установил все тулзы
asdf install

И всё, больше ничего.

В случае же моего синка можно лупануть башизмом на новой тачке нечто типа такого
cut -d' ' -f1 ~/.tool-versions | xargs -I{} asdf plugin add {} && asdf install


Вы только подумайте.
Потерял ПК/заменил ПК/пересел на другое место(тем, кто в офис ходит и там стационар)/переобулся и стал маководом - засинкал файлы(удобным вам способом), ввел пару команд и у вас на вашем ПК:
- все известные вам утилиты известных вам версий установлены
- все привычные алиасы и настройки баша так же доступны
Не надо тратить снова сутки на настройку рабочего места.
Скорость готовности рабочего места зависит лишь от скорости интернета при скачивании пакетов.
Я ещё люблю саму фичу:
- на маке, допустим, обновил helm до 3.8, пересел на винду, а у меня там уже helm3.8, а не старая 3.6.
Невероятно удобно. Идентичная среда везде и всегда, никаких багов.

* все пакеты качаются из официальных репозиториев, никаких левых пакетов!
** файлы с креденшлами НЕ синхронизируются и так делать нельзя
*** альтернативы OneDrive: google drive, icloud, dropbox, yandex.disk
**** все файлы выше это лишь базовый пример, так-то у меня синкается значительно больше вещей.
***** все файлы из WSL2 залинкованы через
ln -s /mnt/c/Users/alex/OneDrive/wsl2/.bashrc ~/.bashrc


Если вы хотите начать, но не знаете с чего начать с asdf, можете смело украсть примеры с гитхаба у людей.
https://github.com/search?q=path%3A**%2F.tool-versions+kubectl&type=code
Полный список плагинов можно найти тут https://github.com/asdf-vm/asdf-plugins

Раньше я ещё синкал keybindings.json settings.json у VScode, но теперь это синкается автоматически через мой аккаунт средствами самого VScode.
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥8👍4👀2
#пятница

Три темы писем, которые боюсь получать:
- Urgent: cloud cost anomaly detected
-
⚠️Prod is down. Last email alert. Slack is unavailable.
- 🎉
🚀2025 Performance Review. 🎉🚀

Бл, лучше бы сейчас пришло второе
Please open Telegram to view this post
VIEW IN TELEGRAM
😁9
Снова terragrunt.

Рано или поздно все хотят шаблонов.
Появляется структура каталогов, файлов, модулей.
Пишутся свои и переипользуются чужие.

Иногда приходим к подобным структурам(это лишь пример, это не бест практис):
infrastructure/
├── terragrunt.hcl
├── modules/
│ ├── networking/
│ ├── database/
│ ├── kubernetes/
│ ├── monitoring/
│ ├── security/
│ ├── storage/
│ ├── compute/
│ ├── iam/
│ ├── logging/
│ └── dns/
└── environments/
├── dev/
│ ├── terragrunt.hcl
│ ├── networking/
│ │ └── terragrunt.hcl
│ ├── database/
│ │ └── terragrunt.hcl
│ ├── kubernetes/
│ │ └── terragrunt.hcl
│ └── ...
├── staging/
│ ├── terragrunt.hcl
│ ├── networking/
│ │ └── terragrunt.hcl
│ ├── database/
│ │ └── terragrunt.hcl
│ └── ...
└── prod/
├── terragrunt.hcl
├── networking/
│ └── terragrunt.hcl
├── database/
│ └── terragrunt.hcl
└── ...

При работе с такой структурой все красиво, удобно и замечательно происходит кроме одной вещи.
Неиспользование кеша провайдеров.
При запуске terragrunt plan в каждой из директорий по сути качает в эту директорию и провайдер и копию модуля.
При запуске terragrunt run-all и вовсе может занять десятки минут и сожрать много места на вашем диске( у меня однажды было порядка 200 гигабайт).

На помощь нам приходит простая переменная.
export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"
mkdir -p $HOME/.terraform.d/plugin-cache

У меня это просто в башрс лежит
>cat ~/.bashrc |grep -i terra
export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"

В этом случае у нас идёт пере использование бинарного файла.

В кратких тезисах это работает внутри:
- в директории ~/.terraform.d/plugin-cache хранятся только бинарные файлы провайдеров
- в .terragrunt-cache хранится рабочая копия нашего кода (модулей Terraform)
- "тяжелые" бинари в .terragrunt-cache имеют симлинк в ~/.terraform.d/plugin-cache
Пример
environments/dev/networking/
├── terragrunt.hcl
└── .terragrunt-cache/
└── AbCdEfGh12345/
└── XyZaBcDe67890/ # хеш-директория
├── main.tf # копия нашего модуля терраформа
├── variables.tf
├── outputs.tf
├── .terraform/
│ └── providers/
│ └── registry.terraform.io/
│ └── hashicorp/
│ └── aws/
│ └── 4.67.0/
│ └── linux_amd64 -> ~/.terraform.d/plugin-cache/registry.terraform.io/hashicorp/aws/4.67.0/linux_amd64 # симлинк на провайдер в директории с кешем
└── ...


Насколько мне известно нельзя полностью перетащить файлы модуля терраформа к бинарям, так как
- разные модули могут требовать разные версии одного и того же кода
- при параллельном выполнении, например terragrunt run-all нужны изолированные рабочие каталоги

Использование этой переменной нам дадут:
- многократное снижение утилизации диска по размеру
- быстрый старт при первом клонировании репозитории и запуска террагранта

* Эта переменная НЕ избавит вас полностью от создания директории .terragrunt-cache/ ибо это невозможно насколько мне известно.

** Так же рекомендую добавить эту директорию в gitignore, для работа гита она не нужна.
>cat .gitignore |grep -i terra
.terragrunt-cache/


#terragrunt #terraform
🔥4👍3
Slack приуныл по всему миру.
Алёрты не приходят(во всяком случае ко мне не все).

TODO: продублировать критикал алёрты через почту телеграм при недоступности слака.

https://slack-status.com/

ну так себе алёртинг я сделал
👀1
"Busy busy busy busy, need a vacation"

Чертовски обожаю эту фразу из фильма Константин 2005 года
https://youtu.be/xoD44rohrtU?si=YFBoQT1OATUEP2z-&t=103

Эта фраза и выражение его лица описывает моё состояние, когда считаю чего у нас по тратам.
Как говорит моя супруга - не важно сколько ты зарабатываешь, важно понимать, сколько ты тратишь, девопс херов🤣.

Каждые 6 месяцев я провожу ревизию "а куда уходят деньги".
Сперва я хотел написать, что 2024 и 2025 были самыми затратными годами - эпоха ИИ, эра автоматизации и век подписок, но потом поднял записи за 2019-2021, когда я с ноги вкатывался в айти и убивал тонны денег на курсы и книги, там тоже траты невероятно огромные.
Отус, Скиллфактори и Слёрм выпивал все наши семейные деньги с кредитки подчистую.

Итак 2025 год:
- $477 в год - https://learning.oreilly.com/
Самый лучший сборник книг, курсов и планов развития
Например этот курс самый лучший курс в мире про линукс
https://learning.oreilly.com/course/red-hat-certified/9780137931521/
- $218 в год - https://account.jetbrains.com/ All Products Pack
Пользуюсь 6 софтинами(datagrip my love, idea, goland, dataspell, pycharm и writerside)из всего пака, остальные не зашли.
- $216 в год - https://claude.ai// PRO
ИИ номер два
- $300 в год https://grok.com/ SUPERGROK
ИИ номер ноль
- около $300-350 в год уходит на курсы с разных источников
Это не подписка, но в среднем так и выходит в год.
Например в августе 2024 года приобрёл прекрасный пак ALL THE THINGS на https://learn.cantrill.io/ за $200. Прошёл 35 часов пока.
Или в январе 2024 оплатил $89 за год подписки, качал себе навык https://www.educative.io/courses/grokking-the-system-design-interview .
Прошёл весь, правда не понял половины, придётся пересматривать.
- $99 в год MS office family 365 (5 юзеров из 6 используется)
Лучший софт для офиса, великолепное решение для облачного хранилища.
5 человек получают по 1терабайту с очень отличной скоростью. То есть каждому и пакет офис и каждому по 1 терабайту.
Выгодно всем, но плачу один я🤣
* когда платил в рублях до 2021 было вообще копейки, практически 4000 рублей в год, покупал на яндекс маркете.
- $40 в год на https://medium.com/
Вот сейчас пишу это и понимаю, что надо вырубить нафиг.
- 2600 рублей в год https://music.yandex.ru/home family на 4 человека
музыка русских исполнителей (не всё есть в спотифай)

- $20 в месяц https://www.perplexity.ai/
ИИ номер один
- $10 в месяц на дешёвые VPS
под VPN в разные направления. Этот мир стал не так прост без VPN.
- около $5-50 в месяц на работу с https://openai.com
Но тут скоро уже не буду платить, наигрался, брал для локальных игр с текстовыми моделями
- 360 рублей в месяц на VoIP в/из России с личным московским номеров https://www.telphin.ru/
увы, мой отец очень не молод и не смог в смартфоны, с его кнопочного можно звонить только на обычные номера, никаких вайбер/телеграм/ватсап
- ~$25-45 в месяц https://cloud.linode.com/
два моих пет-проекта, которые раньше приносили денег, а сейчас не приносят и я всё ещё надеюсь, что стрельнёт и всё плачу :(
- 30 евро в месяц - интернет 500/500
- 279 рублей в месяц esim RU
- 3 евро в месяц esim RS
- 360 рублей в месяц esim UZ
- $1.7 https://www.spotify.com/
не вся музыка есть на Яндекс музыке
- 3,5 евро в месяц на приложение wolt+
Доставка еды и товаров из магазинов. За счёт бесплатной доставки, частых заказов и промоцен - выгодно.
- 0.9-9 евро в месяц на https://www.amazon.de/amazonprime
Ну тут тоже из-за доставки быстрый/бесплатной/без обязательного минимума. Цена плавающая - купоны, скидки, спецпредложения.
- $15 в месяц https://codeium.com/
топовый ИИ IDE. Но я их часто меняю, был copilot+vscode, потом Cursor, теперь этот. Но в целом они вроде все в среднем так стоят.
Может через полгода переключусь на что-то другое.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍73🔥1
- 20.000 рублей в месяц каждому родителю, итого 80.000 рублей в месяц(+тесть и тёща).
Помощь пенсионерам. Сперва нас на ноги ставили и очень сильно помогали, теперь пора и нам.
Начинал с 10.000, как понял, что тяну такую помощь, постепенно поднял до 15к и в 2025 году уже могу тянуть такую невероятно огромную сумму. Сумма невероятно большая, но моя любовь больше.

Все траты указаны с учётом всех скидок, купонов, непрерывного продления(jetbtains) и низких региональных цен по карте оплаты.
Траты на коммуналку, еду, такси, игры в стим, разовые походы в бассейн, футболки, общественный транспорт и прочее не считаю, так как это у всех разное и часть трат нерегулярные.

P.S. на фотке - я
😁53
Иногда я сам горю от своей тупости детских ошибок.

Ну как вообще так можно было сделать?
Пилил дашборд графаны, в котором помимо привычных данных(CPU usage, memory, workers, queries etc) отображается ещё и данные напрямую из trino.
Прям внутри графаны SQL запрос.
SELECT
date_format(started, '%H:%i:%s') as time,
date_diff('second', started, last_heartbeat) as duration_seconds,
state,
query
FROM system.runtime.queries
WHERE (state = 'RUNNING' AND date_diff('second', started, last_heartbeat) > 10)
OR (state = 'FINISHED' AND date_diff('second', started, last_heartbeat) > 10)
ORDER BY duration_seconds DESC
LIMIT 15

И он строит таблицу с временем, длительности запросов, статусом и квери(обрезано на скрине).
Таким образом можно отслеживать подвисшие запросы или неоптимизированные (например join 1000*1000*1000 от мастеров fatality-гениалити).
Потом это трансформирую графаной и вывожу.
Получил алерт - побежал в графану - увидел детальную инфу.

Как можно допускать такие ошибки?
Что такое 1.83 минуты? Что такое 2.95 минут?
Как это интерпретировать?
Стыдоба, инженер-олень🤦‍♂️.

#trino #grafana
😁2
#бытовое #всратость

История в нескольких частях.

Полосочки.
Сломался у меня телефон. Сперва я думал это я сел на экран, но оказалось это проблема всех гугл пикселей выше 8 серии.
Полоска на экране, цвета зелёные, чёрные, глаза печальные.
Аригато, что за 800+ евро такие охрененные девайсы пилят.
Какое-то время то работало, то нет, а потом и вовсе умерло.
Как только почти умерло я тут же во все(!) сайты/утилиты заново сделал логаут, логин с MFA(MS authenticator) и радостно побежал в сервис. Ну типа если во время ремонта что-то случится, а у меня новые сессии.

Сервисмод.
В сервисе смотрели на меня как на умалишённого деда, в запале желающего и телефон починить, но и не отдавать врагам свои данные банк клиентов, пять десятков мультифакторных авторизаций и драгоценную переписку с братом и общие мемы про его лысину.
Оказалось всё придумали до нас, есть такая штука, во всяком случае в андроиде - сервис мод.
Я из деревни, мне можно было такое не знать.
Включаешь режим, вводишь пин-код, телефон перезагружается - в нем только дефолт приложения и доступа к моим данным типа нет. Возврат аналогично через пин и рестарт.
В сервисе у меня забрали телефон, я вышел из здания и остался без рук.
Как клоун с Bluetooth наушниками на голове, которые никуда не подключены уже🤣,

Инвалид.
Ровно тогда, когда я сдал телефон я вспомнил, что мне надо порешать несколько дел в городе.
Привыкший в расписанию общественного транспорта в приложении, вызову такси и картам с расположениями ключевых мест я оказался словно инвалид посреди города.
Меня спас дед, который проснулся во мне.
Нет приложения такси? Ну так куча вариантов:
- иди на остановку таксистов и там садись в свободное за наличные
- поймай на руку
- иди к ближайшему отелю, к ним часто такси подъезжает и 99%, что после высадки он будет свободным
Нет расписания автобусов?
- у нас карты на остановке отменили? Со схемами и маршрутами.
- расписание на останове тоже отменили?
Там хоть и написяли маркером поганая молодёжь, но что-то да можно разобрать.

Штаны.
Конечно же я наложил в штаны со всем этим планом.
Ровно через 0.0001ms после того, как я вернулся домой, у меня слетели 95% авторизаций во все рабочие порталы: GitLab, office 365(в том числе и личный), Teams(ну да и хер с ним на самом деле), куберы, ажур, конфлюенс с джирой и вообще я мог только в слаке трындеть. В общем не продуктивный вышел день.
Впрочем непродуктивный вышел день и последующий, ведь вовремя телефоны чинят только в сказках и Москве, ровно к 10 утра я его не смог забрать из сервиса.

Детокс.
Всё это время, без телефона, я ощущал себя как будто в новом непривычном мире.
Удача обошла меня стороной, я даже в телеграм зайти не смог, провайдер сменил IP и даже почта и телеграм захотели получить аппрув, а его я предоставить не мог.
Даааа, угадайте что со стимом и играми. Даааа, всё так.
Чем же я занимался? - ходил нюхал воздух, трогал траву, смотрел в стену, гладил кота.
Благо дома amazon kindle меня не подвёл и я прекрасно перечитал за полтора вечера весь восхитительный цикл Пехова - Страж.


Увы, без мульти факторной авторизации мы подвергаем себя риску, но и без своевременных аппрувов я буквально остался без рук, ни для личных задач, ни для работы.
Мы слишком сильно привязаны к нашим смартфонам и это не только тиктоки, да инстаграммы.
Без техники мы возвращаемся во времена мезозоя.
Во мне хоть и проснулось брутальное воспитание союза, в котором нас учили ориентироваться на местности, читать карты и стоять в очереди за сахаром разбираться с проблемами самостоятельно, но я ни в коем случае не желаю таких навыков всему современному поколению.
Мир крутой, зачем всё усложнять.
Если телефон с миллиардом приложений помогает жить, то почему нет.
Главное при этом не выходите из дома, а иначе заблудитесь 🤣
Please open Telegram to view this post
VIEW IN TELEGRAM
👍74😁3🔥1
Алертменеджер.
Больше применимо к стеку VM (привет чату @VictoriaMetrics_ru1 ✌🏼)

Полезные ссылки, которыми часто пользуюсь.
1) https://prometheus.io/webtools/alerting/routing-tree-editor/
Проверка алёртов и рутов.
- вставил конфигурацию Алертменеджер (!!!БЕЗ КРЕДОВ РЕСИВЕРОВ!!!)
- он отрисовал дерево всех ресиверов
- вставил интересующий тебя лейбл для рутов с матч/матчерс
- понял в какой/какие ресиверы пойдет (или нет) твой Алерт по роуту
То есть прям визуально можно понять туда или не туда пойдёт алёрт.
Актуально при большом количестве ресиверов, при первом ресивере null и при большом количестве routes.
2) https://samber.github.io/awesome-prometheus-alerts/rules
Огромный список алёртов по многим областям - базы данных, кубернетис, ингрессы и так далее.
Актуально для тех, кто не знает с чего начать.
3) https://github.com/monitoring-mixins/website/tree/master/assets
Тоже самое, что и второе, но примеров заметно больше.
4) https://github.com/prometheus/alertmanager
В самом алёртменеджере есть утилита amtool, в CICD можно запилить валидацию конфигурации.
Актуально не для всех флоу. Скорее всего не будет работать для терраформа с хелмом и гитопса.
5) https://promlabs.com/promql-cheat-sheet/
Куча трюков и подсказок. Обычный cheat sheet.
Часто отсюда ворую, когда идеи заканчиваются.
6) https://github.com/prymitive/karma
Для тех, кого бесит ущербный интерфейс алёртменеджера родом из 2001 года с птушным дизайном клоунов дизайнеров.
Я на самом деле поел два не критикал бага, прям на 100% не рекомендовал бы, но визуально он, конечно же, красив, чертяга.
7) https://chaostoolkit.org/
Хаос-фронтенд-манки тулза
Напрямую не связан с алертменеджером, но я при его помощи тестирую все алёрты, разламывая к херам кластера тестовые.

Ок, ссылками разобрались.

Типичные траблшутинги.
1) "а чего у меня сообщение не уходит в телеграм с алёртом"
- есть ли из кластера доступ до апи телеги? (от ноды до интернетов телеги)
kubectl run telegram-test --image=curlimages/curl --restart=Never --rm -i --tty -- \
curl --max-time 10 --connect-timeout 10 https://api.telegram.org

- правильный ли токен? (можно и локально)
нечто типа
curl -s "https://api.telegram.org/bot<ваш_токен>/getMe"

- создаётся ли сам алёрт на алёрт менеджере (локально, попросите ИИ сгенерить от вашего алерта вам джейсон для вас по аналогии). У алертменеджера 2 версии апи, смотрите какая версия у вас и под неё спрашивайте нейронку запрос.
curl -X POST https://*********/api/v1/alerts \
-H "Content-Type: application/json" \
-d '[
{
"labels": {
...
},
"annotations": {
...
},
"startsAt": "'"$(date -u +"%Y-%m-%dT%H:%M:%SZ")"'",
"endsAt": "'"$(date -u -d "+3 minutes" +"%Y-%m-%dT%H:%M:%SZ")"'"
}
]'


- если всё выше проверено, всё ок, то смотреть нет ли у тебя вшивого оператора алёртменеджера?
Если есть, то уходи от идеи нескольких и пихай всё в один.
Он при мерже какую-то ересь делает и оно перестаёт работать.
На момент марта 2025 года я строго НЕ рекомендую использовать несколько их.
Только один. пилите всё в одном.
Чекаем, если больше 2, то у меня плохие новости(на момент написания материала)
kubectl get VMAlertmanagerConfig -A |wc -l

- проверяем руты - в тот ли ресивер(ы) идёт ваш алёрт?
Первая ссылка с деревом, вставляем конфиг, лейблы и чекаем.
- чего в логах алёртменеджера?
- ну и сам конфиг ресивера хоть верный?
https://prometheus.io/docs/alerting/latest/configuration/#telegram_config

#alertmanager
5🔥4👍1