Обновить

Бэкенд

Сначала показывать
Порог рейтинга

Для чего нужен атрибут useglobal в полях форм и как его применять в Joomla 5

В официальной документации есть краткая статья Conditional Field Display Customizing Forms Based on Global Settings, у меня не получилось перевести её дословно, поэтому расскажу своими словами.

Давайте разберёмся что это такое на примере компонента com_contact. Посмотрим настройки компонента.

(Здесь должна была быть картинка, но в посте она может быть только одна.)

Видим что параметр Contact Category в положении Hide (у вас может быть в другом).

Теперь откроем страницу создания/изменения контакта и перейдём на вкладку Display.

Мы видим что параметр Category имеет первый вариант Use Global (Hide). То есть нам не надо помнить значение из общих настроек компонента, оно перед нами. Если мы изменим его в компоненте, то оно изменится и здесь.

Как это использовать разработчику компонентов

У меня есть простой компонент для экспорта товаров из JoomShopping в XML com_wishboxjshoppingxmlexport.

Добавлю в настройки компонента поле test_mode в файле: Root/administrator/components/com_wishboxjshoppingxmlexport/config.xml

<field
		name="test_mode"
		type="list"
		label="COM_WISHBOXJSHOPPINGXMLEXPORT_FIELD_TEST_MODE_LABEL"
		default="0"
>
	<option value="0">JNO</option>
	<option value="1">JYES</option>
</field>

И добавлю такое же поле в сущность (item) в файле: Root/administrator/components/com_wishboxjshoppingxmlexport/forms/item.xml

<field
		name="test_mode"
		type="list"
		label="COM_WISHBOXJSHOPPINGXMLEXPORT_FIELD_TEST_MODE_LABEL"
		default="0"
>
	<option value="0">JNO</option>
	<option value="1">JYES</option>
</field>

Добавим полю в форме Item атрибут useglobal="true"

<field
		name="test_mode"
		type="list"
		label="COM_WISHBOXJSHOPPINGXMLEXPORT_FIELD_TEST_MODE_LABEL"
		default="0"
        useglobal="true"
>
	<option value="0">JNO</option>
	<option value="1">JYES</option>
</field>

Готово! На странице создания/изменения Item‑а экспорта у поля test_mode появилась опция Use Global (Yes). То есть достаточно добавить атрибут useglobal="true".

Из каких глобальных настроек берётся значение

  • из настроек компонента (компонент определяется параметром option в URL, кроме редактирования пункта меню, для меню подставляется компонент из ссылки пункта меню);

  • из общих настроек Joomla если не получили из настроек компонента.

В каких типах полей стандартных полей работает этот атрибут

  • ListField — Добавляется опция Use Global (...);

  • NumberField — Значение из глобальных настроек отображается как placeholder;

  • TextField — Placeholder.

А так же во всех полях, которые наследуют одно их вышеперечисленных.

Теги:
Всего голосов 1: ↑1 и ↓0+3
Комментарии0

Я устал от форматирования JSON файлов

Я много и часто просматриваю JSON-файлы: от конфигураций сервисов до API ответов и логов. Каждый раз, открывая очередной файл, я форматирую содержимое, чтобы было удобнее читать (ведь JSON не только machine-readable, но и human-readable). И каждый раз я грущу, что все сервисы (онлайн, встроенные средства IDE и даже плагины) предоставляют лишь две крайности: форматировать всё или ничего (минифицировать в одну строку).

Но что, если я хочу отформатировать JSON лишь до определённого уровня? Что, если у меня есть огромный список словарей (возможно, даже глубоких), который при форматировании выглядит как-то так:

[
    {
        "id": 1,
        "name": "Alice",
        "birthday": {
            "day": 5,
            "month": 4,
            "year": 1983
        }
    },
    {
        "id": 2,
        "name": "Bob",
        "birthday": {
            "day": 6,
            "month": 2,
            "year": 1945
        }
    },
    {
        "id": 3,
        "name": "Eve",
        "birthday": {
            "day": 10,
            "month": 11,
            "year": 1978
        }
    }
]

Что, если я хочу оставить каждый словарь в более компактном (не совсем минифицированном) виде? Например, таком:

[
    {"id": 1, "name": "Alice", "birthday": {"day": 5, "month": 4, "year": 1983}},
    {"id": 2, "name": "Bob", "birthday": {"day": 6, "month": 2, "year": 1945}},
    {"id": 3, "name": "Eve", "birthday": {"day": 10, "month": 11, "year": 1978}}
]

Или я хочу, чтобы в каждом словаре развёрнуты были только внешние ключи?

[
    {
        "id": 1,
        "name": "Alice",
        "birthday": {"day": 5, "month": 4, "year": 1983}
    },
    {
        "id": 2,
        "name": "Bob",
        "birthday": {"day": 6, "month": 2, "year": 1945}
    },
    {
        "id": 3,
        "name": "Eve",
        "birthday": {"day": 10, "month": 11, "year": 1978}
    }
]

Да, многие текстовые редакторы вроде Sublime Text или VS Code дают возможность свернуть контент до определённого уровня. Но что, если я хочу оставить файл в этом промежуточном виде и просматривать его прямо в терминале, подключившись по ssh? Или я хочу посмотреть файл на гитхабе с телефона? Да, возможно, мои вкусы весьма специфичны, но в существующих реалиях я вынужден грустно довольствоваться лишь полностью развёрнутым вариантом (или делать это вручную). Встроенные средства форматирования JSON в JS или Python также не предоставляют простой возможности ограничить глубину (либо я так и не научился их готовить).

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

Да, он вряд ли подойдёт, чтобы редактировать на лету гигантские JSON файлы. И он уж точно не пытается стать убийцей какого-либо из существующих онлайн сервисов. В первую очередь он призван решить мою проблему: сделать форматирование JSON чуточку более управляемым. А если и вы сталкивались с подобной проблемой, буду рад, если сервис поможет и вам!

Теги:
Всего голосов 7: ↑7 и ↓0+7
Комментарии0

Задача о габаритном файле и ошибке

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

Условие

В компании «Доки.Онлайн» выкатили обновление: теперь пользователи могут загружать PDF-файлы с отсканированными договорами. Все работало отлично в локальной среде — разработчик протестировал загрузку больших файлов, убедился, что API обрабатывает их корректно, и спокойно отправил изменения в продакшн.

Но радость была недолгой. На боевом сервере при попытке загрузить файл система выдавала ошибку 413 Request Entity Too Large. Причем происходило это до того, как пользователь получал какой-либо отклик от самого приложения.

Разработчик Геннадий Завров начал искать причину. Он проверил логи всех четырех компонентов системы:

  • фронтенда;

  • API Gateway (определяет, в какой микросервис послать запрос);

  • микросервиса загрузки файлов;

  • микросервиса обработки документов.

Во всех логах пусто, будто никакого запроса и не было. Ни один сервис даже не попытался начать обработку файла.

Геннадий начал подозревать сетевые сбои, перегрузку API Gateway и баг в коде фронтенда. Однако простые тесты с маленькими файлами работали стабильно. Проблема проявлялась только при загрузке чего-то «потяжелее».

В какой-то момент он задал себе вопрос: а точно ли запрос доходит до приложений?

Задача

Почему при загрузке большого файла система возвращает ошибку 413, если сами сервисы даже не видят входящий запрос? Кто может остановить запрос еще до бэкенда?

Делитесь своим ответом в комментариях. А посмотреть полное решение можно в Академии Selectel.

Теги:
Всего голосов 2: ↑2 и ↓0+4
Комментарии3

Порождающие паттерны Prototype и Singleton: а минусы будут?

В новой серии открытого курса «Паттерны и практики написания кода» мы завершим изучение порождающих паттернов знакомством с двумя шаблонами — паттерном Прототип и паттерном Синглтон. Вместе с бэкенд-инженером Юрой Афанасьевым разберемся, почему паттерн Prototype — простой в реализации — используется редко, а паттерн Singleton — самый критикуемый.

Смотреть VK
Смотреть YouTube

Подписывайтесь на канал AvitoTech в Telegram, там мы рассказываем больше о профессиональном опыте наших инженеров, проектах и работе в Авито, а также анонсируем митапы и статьи.

Теги:
Всего голосов 28: ↑26 и ↓2+24
Комментарии0

Разработчики в одиночку дизраптят вертикальные рынки создавая AI-native компании

Помимо самого ИИ, который как снег на голову, мы находимся на пороге беспрецедентного передела бизнес-рынков.

Лидеры мнений говорят, что AI-native компании будут достигать соответствия продукта рынку быстрее, всего с одним основателем, но с более высоким уровнем автоматизации, чем когда-либо прежде.

Консалтеры предсказывают появление лидеров рынка “из ниоткуда”, управляемых одним человеком. И это в общем то уже не будущее, сегодня один разработчик с правильными навыками может в одиночку создать продукт, способный конкурировать с многомиллиардными корпорациями, а уж с малым бизнесом и подавно. И я как раз в основном про МСП.

Сегодня практически нет такого малого и среднего бизнеса, который был бы надежно защищен от сильного конкурента в лице одного умного разработчика. 

Пару слов о себе. Я более 20 лет в инновационном и стратегическом консалтинге, а последние 5 лет параллельно ментор стартапов в Сколково. Только за последние несколько лет через меня прошло более полутора сотен продуктовых команд и стартапов, с которыми мы обсуждали как развивать, усиливать или менять их продукт с приходом ИИ.

Год назад я придумал и затем запустил движение айвенторов, технологических предпринимателей нового поколения, которые готовятся к реализации новой бизнес-модели соло-предпринимателей, окруженных пулом ИИ-агентов и MAS.

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

Далее, в основной статье, я попробую раскрыть эту мысль и показать как и почему обычный разработчик может стать довольно большим перцем, если конечно очень захочет.

Но сегодня об иллюзиях.

Зона иллюзий: Какие мифы породила эта революция?

Миф первый: "Любой может создать AI-стартап"

Реальность жестче. Порог входа сместился с денег на компетенции. Да, вам больше не нужны миллионы долларов стартового капитала. Но теперь нужно разбираться в архитектуре LLM, понимать ограничения различных моделей, уметь проектировать “новую автоматизацию” и работать с векторными базами данных. Плюс RAG, управление контекстом в MAS, оптимизация inference.

Это уже не классическое программирование, а скорее инженерия интеллектуальных систем. Т.е. технический порог не исчез, он трансформировался.

Миф второй: "Теперь всё просто, нажал кнопку и готово"

На самом деле, AI-native продукты требуют глубокого понимания предметной области. Создать чат-бота может каждый, но создать AI-агента, а тем более мультиагентную систему, которая реально решает бизнес-задачи, – это уже искусство. Нужно знать, как настроить модель под конкретные задачи, как обучить её на ваших данных, как интегрировать с существующими системами.

Миф третий: "Конкуренция стала проще"

Парадокс: барьеры входа снизились, но конкуренция стала глобальной с первого дня. Раньше вы конкурировали с местными игроками, а теперь, с лучшими разработчиками планеты. Легко стартовать, но намного сложнее удержаться, когда ваш конкурент может появиться из любой точки мира и скопировать вашу идею за несколько недель. Можно подумать, что все решат бюджеты, у кого больше, тот на рынке и останется. Но нет, ведь есть разные модели заработать на этом.

Миф четвертый: "Независимость от крупных корпораций"

Ирония в том, что AI открывает рынки, но делает игроков более зависимыми от крупных вендоров. OpenAI, Google Cloud, Azure – это все новые монополисты. Один измененный API, один повышенный тариф, и ваш новый бизнес может оказаться под угрозой. Независимость обернулась новой формой зависимости. Однако, тренд на демократизацию интеллекта, решает и эту проблему.

Что я еще упустил из иллюзий?

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

Теги:
Всего голосов 10: ↑9 и ↓1+10
Комментарии3

unraisable exceptions в питоне

Мы все с вами привыкли, что в питоне можно "зарайзить" исключение в любой момент: raise Exception
Но, что если в какой-то момент времени мы не можем вызывать исключение?

Простейший пример: что произойдет при запуске такого скрипта?

# ex.py
class BrokenDel:
    def __del__(self):
        raise ValueError('del is broken')

obj = BrokenDel()
del obj
print('done!')  # будет ли выведено?

Тут может быть два варианта:

  1. Или del вызовет ValueError и программа завершится

  2. Или случится какая-то магия, ошибка будет вызвана, напечатается, но программа продолжится

Ну и так как мы с вами на том канале, где мы с вами, то конечно же будет второй вариант.

» python ex.py
Exception ignored while calling deallocator :
Traceback (most recent call last):  File "/Users/sobolev/Desktop/cpython/ex.py", line 3, in __del__    raise ValueError('del is broken')
ValueError: del is broken
done!

Знакомьтесь – unraisable exceptions 🤝

Как оно работает?

В некоторых местах C кода у нас есть необходимость вызывать исключения, но нет технической возможности. Пример, как выглядит упрощенный dealloc для list?

static void
list_dealloc(PyListObject *op)
{
    Py_ssize_t i;
    PyObject_GC_UnTrack(op);  // убираем объект из отслеживания gc
    if (op->ob_item != NULL) {
        i = Py_SIZE(op);
        while (--i >= 0) {
            // уменьшаем счетчик ссылок каждого объекта в списке
            Py_XDECREF(op->ob_item[i]);  
        }
        op->ob_item = NULL;
    }
    PyObject_GC_Del(op);
}

А, как вы можете знать, чтобы в C коде вызвать ошибку, нужно сделать две вещи:

  • Взывать специальное АПИ вроде PyErr_SetString(PyExc_ValueError, "some text")

  • И вернуть NULL как PyObject * из соответствующих АПИ, показывая, что у нас ошибка. Если вернуть NULL нельзя, то мы не можем поставить ошибку в текущий стейт интерпертатора. А тут у нас void и вернуть вообще ничего нельзя. Потому приходится использовать вот такой подход с unraisable exception

Ошибку мы "вызываем" через специальные АПИ:

Они создают ошибку, но не выкидывают её обычным способом, а сразу отправляют в специальный хук-обработчик. Данный хук не производит классическое "выбрасывание" исключения, а просто его печатает по-умолчанию. Ниже посмотрим, как его можно кастомизировать.

В питоне оно используется где-то 150 раз. То есть – прям часто. Примеры:

  • Ошибки при завершении интерпретатора, попробуйте сами:

import atexit
def foo():
    raise Exception('foo')
atexit.register(foo)
  • Ошибки внутри sys.excepthook

  • Ошибки внутри gc

  • Ошибки внутри логики установки ошибок (вдруг память кончилась, например) 🌚️️️️

  • И многое другое

Пользовательское АПИ

Ну и конечно же, есть специальный хук для обработки таких ошибок: sys.unraisablehook

Он может выполнять любой пользовательский код, который мы установим при старте приложения.

Например, pytest использует кастомный хук, чтобы валить тесты при возникновении такой ситуации. Что логично.

Нравится контент про технику и устройство технологий? Присоединяйся к каналу @opensource_findings в телеге; там много такого.

Обсуждение: знали ли вы про такую особенность? Приходилось ли где-то в мониторинге особо настраивать?

Теги:
Всего голосов 9: ↑8 и ↓1+10
Комментарии1

На нашу материнскую компанию Southbridge была совершена атака 😱

Проблему давно решили, но именно после этого мы поняли, что нужно больше думать о безопасности. Мы начали разбираться в процессах, стали копать, что такое DevSecOps, а что — совсем не оно.

Так родился интенсив DevSecOps Bootcamp, до которого остался всего месяц.Мы активно готовимся и ждём команды, готовые встраивать безопасность в свои процессы.

4 июня встречаемся на бесплатном вебинаре, где разберём:

  • Dev vs Sec: всё ещё не разговаривают — почему?

  • Что DevSecOps может, а что не может?

  • Где DevSecOps реально помогает бизнесу, а где мешает?

  • Time to market — вечная басня, которая не про DevSecOps

  • Где в DevSecOps сейчас Ops, если DevSecOps это AppSec?

А ещё — расскажем больше про интенсив, и как мы с его помощью хотим повлиять на инженерную культуру.

Когда: 4 июня в 19:00 мск

Занять место на вебинаре — через бота.

Теги:
Рейтинг0
Комментарии0

Каковы задачи Абстрактной Фабрики?

Новая серия курса «Паттерны и практики написания кода» целиком посвящена разбору достаточно громоздкого паттерна — Абстрактной Фабрики. Вместе с бэкенд-инженером Юрой Афанасьевым на примерах разберем, что это такое и как она реализуется.

Смотреть VK
Смотреть YouTube

Подписывайтесь на канал AvitoTech в Telegram, там мы рассказываем больше о профессиональном опыте наших инженеров, проектах и работе в Авито, а также анонсируем митапы и статьи.

Теги:
Всего голосов 22: ↑22 и ↓0+22
Комментарии0

Isar и еще 8 систем сборки для создания дистрибутива на Linux

Isar — система сборки, представляющая собой набор скриптов для создания пакетов и дистрибутивов на базе Debian с возможностью настройки. Организация проекта Isar похожа на Yocto Project, для сборки используется Bitbake.

Перед сборкой можно настроить параметры файловой системы, ядра, модификации списка пакетов (добавление и удаление пакетов, в том числе и собственных, изменение существующих пакетов). Систему сборки разрабатывает компания ilbers GmbH.

Архитектура системы

Так как Isar основан на Bitbake, архитектура решения состоит лишь в нескольких слоях для Bitbake, реализующих сборку и установку пакетов в соответствии с конфигурацией сборки. В основе всех этих слоев и рецептов лежат утилиты Debian Build Toolchain, которые ответственны за непосредственную сборку пакетов, разрешение зависимостей и т.д.

Как проходит процесс сборки дистрибутива в Isar
Как проходит процесс сборки дистрибутива в Isar

Особенности решения

  • Аналогично Yocto требует усилий на начальных этапах для освоения инструмента.

  • Поддерживает загрузку готовых пакетов из репозиториев Debian.

  • Подходит для embedded-дистрибутивов, где необходимо сочетание Debian-экосистемы и глубокой конфигурации.

О других embedded- и desktop-решениях решениях рассказали студенты и преподаватели СПБГЭТУ «ЛЭТИ» в обзоре систем для создания Linux-дистрибутивов.  

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Полезное про учёбу в Слёрме

Собрали подборку полезных материалов про учебу в Слёрме. Если вы учитесь вместе с нами или только планируете начать, этот дайджест — для вас. Читайте полезные материалы, лайфхаки и советы, которые помогут сделать ваш учебный процесс ещё приятнее. 

Как купить обучение выгодно? 4 варианта, как приоберсти курс в Слёрме и сэкономить. 

Как убедить начальника купить курс? Мы уже рассказывали о том, что вы можете попросить работодателя оплатить обучение на профильных курсах. Но как это организовать? Куда идти и что говорить? Рассказываем в статье. 

Платформа Слёрма для онлайн-обучения. Знакомимся с нашей платформой обучения: рассказываем преимущества и интересные фишки, чтобы не тратить много времени на адаптацию к системе. 

Как выбрать комфортный формат обучения? Мы указываем в своих материалах формат курса: поток или видеокурс, но не всегда эта разница понятна. Разбираем подробнее, чтобы вы точно определились, какой вариант для вас удобнее. 

Корпоративное обучение IT-команд. Рассказываем о специальных условиях для корпоративных клиентов. Если вы тимлид, HR, CTO или L&D специалист в IT-компании — эта информация для вас.

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

Универсальные доступы. О том, как можно разово оплатить обучение и получить доступы на курсы, которые можно активировать в течение года с момента оплаты. 

Теги:
Рейтинг0
Комментарии0

Магические квадраты с произведением

 О магических квадратах известно, наверное, всё. А возможны ли магические квадраты, в которых равны не суммы значений в строках, столбцах и на диагоналях, а их произведения? Оказывается – возможны. В дальнейшем буду называть такие квадраты «магическими квадратами с произведением» (сокращённо – МКП).

Интересно, что, как и «обычных» магических квадратов, возможно бесчисленное множество вариантов МКП. В общем случае для трёх чисел a, b и n МКП размером 3 × 3 имеют вид:

При этом ab, a ≠ 1, b ≠ 1, ab2, ba2,

Интересно, что любой МКП размером 3 × 3 может быть основой для формирования бóльших МКП. Одно из возможных решений заключается в том, чтобы поместить такой  квадрат в центр квадрата 5 × 5 и потом подобрать такие остальные числа, чтобы они соответствовали свойствам МКП. Это означает, что МКП являются также так называемыми «рамочными магическими квадратами» – магическими квадратами, которые сохраняют свое магическое свойство, если в них отбросить окаймляющие «полосы» в две клетки.

После комментариев  @miksoft я удалю сей свой пост

Теги:
Рейтинг0
Комментарии6

Работаем с событиями без плагина или как перехватить редирект в Joomla 5

В расширении быстрого заказа для JoomShopping. Я создаю экземпляр модели Checkout и вызываю метод checkStep().

$checkoutModel = JSFactory::getModel('checkout', 'Site');
$checkoutModel->checkStep(2);

В методе checkStep есть условия, при выполнении которых происходит установка сообщения и редирект.

if (!$check)
{
    JSError::raiseNotice('', 'Message');
    $mainframe->redirect('Url');
    exit();
}

Но мне надо получить результат метода checkStep или исключение. И продолжить работу.

Смотрим какое событие вызывается при редиректе — ApplicationEvents::BEFORE_RESPOND.

Подписываться на события могут не только плагины, но и любые другие callable объекты.

Создадим функцию которая получает заголовки редиректа, удаляет их и бросает исключение:

$onApplicationBeforeRespond = function()
{
	$app = Factory::getApplication();
	$response = $app->getResponse();
	$status = $response->getHeader('Status');
	$location = $response->getHeader('Location');
	$response = $response->withoutHeader('Status');
	$response = $response->withoutHeader('Location');
	$app->setResponse($response);

	throw new RedirectCaughtException($status[0], $location[0]);
};

Перед вызовом $checkoutModel->checkStep(2); подпишем нашу функцию на прослушивание события, а после отпишем. И обернём вызов в try/catch.

$dispatcher->addListener(
	ApplicationEvents::BEFORE_RESPOND,
	$onApplicationBeforeRespond
);

try
{
	$checkoutModel->checkStep(2);
}
catch (RedirectCaughtException $e)
{
    // Обрабатываем исключение
}

$dispatcher->removeListener(
	ApplicationEvents::BEFORE_RESPOND,
	$onApplicationBeforeRespond
);

Таким образом мы можем перехватывать редиректы внутри блока try.

Теги:
Всего голосов 1: ↑1 и ↓0+1
Комментарии0

Как выбрать курс по Kubernetes? Roadmap для тех, кто ещё не разобрался

На нашем факультете Kubernetes есть целых шесть курсов, разработанных под разные потребности. Мы подготовили роадмап, который поможет разобраться в них и сделать правильный выбор.

Какой курс подойдёт именно вам? Давайте разбираться!

1. Kubernetes База

Курс для инженеров и администраторов, которые только знакомятся с k8s. Учим базовым вещам: компоненты, абстракции, настройка кластера и работа с ним.

2. Kubernetes для разработчиков

Продвинутый курс с акцентом на разработку. Научим разрабатывать приложение под k8s и запускать его в кластере.

3. Kubernetes Мега

Большой продвинутый курс для инженеров, которые уже работали с k8s (или прошли базовый курс). Разбираем в теории и на практике тонкости конфигурации и установки production-ready кластера.

4. Service mesh

Трехдневный интенсив. Учим эффективно внедрять и поддерживать service mesh в реальных проектах, обеспечивая надежность, безопасность и масштабируемость микросервисных архитектур.

5. Безопасность в Kubernetes

Видеокурс. Подойдёт всем, кто так или иначе касается безопасности проекта — ИБ, DevOps, SRE и разработчикам, самостоятельно работающим с k8s.

6. Мониторинг и логирование в Kubernetes

Видеокурс. Расскажем, что именно мониторить, какие метрики собирать и как настраивать алерты для оперативного поиска и устранения проблем в кластере.

А чем ещё можно дополнить стек?

1. Docker для админов и разработчиков

Видеокурс. Начнём с основ, и уже через три недели вы сможете запускать приложения в Docker и работать с образами на продвинутом уровне.

2. Gitlab CI/CD

Видеокурс. Расскажем про принципы работы CI/CD, научим автоматизировать процесс интеграции и поставки и ускорять цикл разработки с минимальными рисками.

3. CI/CD c Jenkins

Видеокурс. Поможем пройти путь от настройки первого плагина и создания простого пайплайна до Jenkins as code и внедрения в Kubernetes.

Теги:
Рейтинг0
Комментарии0

Ближайшие события

3 ключевые метрики, которые спасут микросервисный проект

Современные системы — это сложные экосистемы, где каждая ошибка может стоить бизнесу денег и репутации. Рассказываем, какие метрики нельзя игнорировать, чтобы не пропустить критичные сбои.

Инфраструктурные метрики

Базовые показатели вроде CPU и RAM уже не спасают. Для микросервисов важнее:

Статус подов в Kubernetes:

  • Количество рестартов.

  • Фейлы readiness/liveness проб.

  • Используйте метрику kube_pod_status_ready в Prometheus, чтобы находить «битые» поды.

Трассировка запросов: время выполнения каждого этапа через Jaeger.

Пример: Если поды перезапускаются чаще 5 раз в час — это сигнал к немедленной проверке.

Бизнес-метрики

Инфраструктура может быть идеальной, но если падает конверсия — бизнес теряет клиентов. Отслеживайте:

  • Конверсию платежей (например, от корзины к оплате).

  • Время обработки заказов.

Код для .NET-сервиса:

using App.Metrics;

public class PaymentService {
    private readonly IMetrics _metrics;
    public PaymentService(IMetrics metrics) => _metrics = metrics;
    
    public void ProcessPayment() {
        try {
            // Логика платежа...
            _metrics.Measure.Counter.Increment(MetricsRegistry.PaymentSuccessCounter);
        } 
        catch {
            _metrics.Measure.Counter.Increment(MetricsRegistry.PaymentFailedCounter);
        }
    }
}

Эти метрики интегрируются в Grafana, чтобы вы видели, как каждая транзакция влияет на бизнес.

Пользовательский опыт

Даже 1 секунда задержки может увеличить отток пользователей на 7%. Контролируйте:

  • Время отклика API (p95, p99).

  • Частоту ошибок 5xx/4xx.

  • Структурированные логи с контекстом:

{
  "timestamp": "2023-10-05T12:34:56Z",
  "level": "ERROR",
  "userId": "a1b2c3",
  "operation": "process_payment",
  "message": "Failed to charge card: insufficient funds"
}

Теги вроде userId помогают быстро найти все связанные с ошибкой события.

Теги:
Рейтинг0
Комментарии0

«Криптонит» приглашает на Spark-митап в Москве 29 мая!

Приглашаем на наш Spark-митап: обсудим кейсы, практики применения и тренды развития!

Когда и где пройдёт?
29 мая в 18:30 в Музее криптографии (https://cryptography-museum.ru/)

Кому Spark Meetup полезен?

  • инженерам данных и аналитикам данных

  • программистам со знанием Spark и Scala

  • всем смежным специальностям из телекома, банков, промышленности и ретейла

Кто будет выступать с докладами?
Эксперты из «Криптонита», Positive Technologies и М2. Программу можно посмотреть тут — https://clc.to/SparkMeetup

Как зарегистрироваться?
Вот по этой ссылке — https://clc.to/SparkMeetup

Будет ли трансляция?
Обязательно будет. Ссылку разместим позже на странице мероприятия — поэтому советуем зарегистрироваться на оффлайн-встречу, даже если вы не сможете прийти. Так вы точно не потеряете ссылку на онлайн

Нужно что-то платить?
Нет, митап бесплатный — ждём всех неравнодушных к программированию на Spark!

Зарегистрироваться — https://clc.to/SparkMeetup

Теги:
Всего голосов 2: ↑2 и ↓0+2
Комментарии0

Ваши приложения в безопасности? Давайте проверим!

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

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

А ещё в боте есть чек-лист по DevSecOps и карта зрелости и приоритетов — забрать их можно бесплатно.

Перейти в бота

Теги:
Рейтинг0
Комментарии0

Порождающие паттерны: какие они и в чем их назначение?

В новой серии третьего сезона курса «Паттерны и практики написания кода» перейдём от теории к практике и погрузимся в мир прикладных паттернов. В предыдущем видео мы узнали, что паттерны делятся на три группы: сегодня вместе с бэкенд-инженером Юрой Афанасьевым начнём рассматривать первую из них — порождающие паттерны

Смотреть VK
Смотреть YouTube

Подписывайтесь на канал AvitoTech в Telegram, там мы рассказываем больше о профессиональном опыте наших инженеров, проектах и работе в Авито, а также анонсируем митапы и статьи.

Теги:
Всего голосов 27: ↑26 и ↓1+25
Комментарии0

Посмотрите на код ниже — где в нём проблема? Пишите ваши мысли в комментариях, а ниже мы дадим решение ошибки.

object UnitError {

def printMsg(message: String): Unit = {
 println(message)
 }

def process(data: List[Int]): List[Unit] = {
 for (element <- data) yield {
 printMsg(s"Элемент: $element")
 }
 }

def main(args: Array[String]): Unit = {
 val nums = List(1, 2, 3)
 val res = process(nums)
 println(s"Результат: $res") // Вывод List[Unit] даёт неожиданный результат
 }
 }

Дальше будет решение — если не хотите спойлеров, пролистните текст ниже.

Ошибка заключается в неверной конструкции при использовании функции process. Она возвращает пустые значения: List((), (), ()). Происходит это потому, что yield собирает результаты каждой итерации. В итоге получается список, состоящий из пустых значений Unit — по одному на каждый элемент в data.

Unit в Scala — это аналог void в Java и Си-подобных языках, означающий пустое значение. В данном примере yield собирает результаты printMsg(...), которые все являются Unit (пустыми).

Программисты, привыкшие к императивным языкам и переходящие на Scala, интуитивно ожидают, что такая конструкция будет возвращать какие-то преобразованные данные, например — как это делает map в JavaScript. То есть, начинающие скалисты могут ожидать здесь на выходе список элементов, а получат пустой вывод.

Исправление

Если требуется вернуть список преобразованных значений, тогда нужно использовать эти значения в yield.

def printMsg(message: String): String = { // Теперь возвращает String
 println(message)
 message // Возвращает саму строку
 }

def process(data: List[Int]): List[String] = { // Теперь функция возвращает List[String]
 for {
 element <- data
 } yield {
 printMsg(s"Обрабатываем элемент: $element") // Теперь выводится результат String
 }
 }
Теги:
Рейтинг0
Комментарии1

Траблшутинг в k8s: инструменты и лайфхаки для разработчиков

➡️ бесплатный вебинар завтра в 19:00.

Что будем обсуждать:

- начнём с kubectl,

- посмотрим сайдкар контейнеры и узнаем, зачем их использовать,

- разберёмся с сетевыми проблемами, 

- научимся использовать strace для сложных случаев.

Будет полезно, даже если ваши сервисы крутятся на bare metal или VM без намёка на оркестрацию.

Спикер: Виталий Лихачев, SRE в крупном нидерландском тревелтехе

Ведущий: Кирилл Борисов, SRE в VK

Когда: 14 мая в 19:00 мск

Занять место на вебинаре — через бота.

Теги:
Рейтинг0
Комментарии0

Привет, Хабр. Подготовили подборку бесплатных открытых уроков от Otus, которые пройдут на этой неделе. Опытные практики проводят вебинары в живом формате, что позволит не только освоить новые знания, но и задать вопросы экспертам. Зарегистрируйтесь и присоединяйтесь!

Вторник, 13 мая:

Среда, 14 мая:

Четверг, 15 мая:

Понедельник, 19 мая:

Список всех открытых уроков по всем ИТ-направлениям можно посмотреть в календаре.

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0