Инженер Perfect Duty

Инженер Perfect Duty

11 ноября 2022 г.

Введение

Многие ИТ-компании переняли практику дежурства. Инженер дежурит, и его дежурство длится смену. Обычно смена длится один день или одну неделю. Бывают случаи увеличения или уменьшения этого периода, но это редкость. Обязанности инженера в этой роли варьируются от компании к компании, но есть некоторые общие моменты.

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

В этой статье мы поговорим о том, как хорошо подготовиться к работе инженером.

Определение идеального инженера

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

Опыт

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

Хорошо бы начать с просмотра уже существующей документации по обработке инцидентов. Имеется ли документация на уровне компании или команды? Важно знать, где он находится, и быть знакомым с ним. Если его не существует, не могли бы вы попытаться инициировать процесс его создания?

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

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

Инструменты

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

Давайте рассмотрим эти инструменты более подробно:

  1. Основным техническим инструментом дежурного, с помощью которого можно решить множество задач, является bash. Если в вашем арсенале еще нет знаний об этом прекрасном инструменте - воспользуйтесь одним из экспресс-курсов (
  2. Часто в огневом режиме необходимо выполнить некоторые операции с базой данных продукта. Навык работы с БД через терминал - psql для PostgreSQL https://www.postgresguide.com/utilities/psql/< /a> или mongosh для MongoDB https://www.mongodb.com/docs/mongodb-shell/ поможет. Эти инструменты приведены в качестве примеров, вы можете искать их в собственной базе данных. Для многих баз данных есть визуальные инструменты для работы, но терминал доступен везде, требует минимального интернета и очень гибок. Для режима огня это может быть очень полезно.
  3. curl – это инструмент, который позволит вам выполнять значительное количество запросов, а в сочетании со знанием bash вы станете почти всемогущим.

Будет очень полезно, если у вас на момент пожара будет под рукой набор готовых скриптов. Они должны быть максимально простыми и понятными. Да, наверное, вы можете написать их очень быстро, но когда вы ограничены во времени, здорово иметь готовый набор, позволяющий думать только о крахе, а не о том, как реализовать ту же завязку. Приведенные ниже сценарии являются лишь представлением потенциальной структуры таких сценариев. Конечно, ваш код должен быть протестирован до инцидента и быть максимально простым и понятным. Полезно иметь следующие скрипты:

Скрипт, создающий файл на основе предоставленных данных. Их можно получить из других команд или сделав независимый запрос. Пример такого скрипта на Python показан ниже.

import csv

def modify(filename):
    tmpFile = "tmp.csv"
    # Reading file with data and creation of output file
    with open(filename, "r") as file, open(tmpFile, "w") as outFile:
        # Create reader for initial file
        reader = csv.reader(file, delimiter=',')
        # Create writer for output file
        writer = csv.writer(outFile, delimiter=',')
        # Read header line
        header = next(reader)
        # Write header line
        writer.writerow(header)
        # Process initial file line by line
        for row in reader:
            colValues = []
            # Process each column of each line
            for col in row:
                # Let for example transform all columns to lowercase
                colValues.append(col.lower())
            # Write modified line to final file
            writer.writerow(colValues)

filename = 'sample_data.csv'
modify(filename)

Сценарий, который будет вызывать требуемые конечные точки с указанным параллелизмом. Это не должно быть что-то сложное. Ниже приведен пример простого кода JavaScript, который сгенерирует файл sh с указанным параллелизмом, который может вам в этом помочь. Да, здесь нет обработки результатов, но она не всегда нужна, и вы можете изменить свой инструментарий, добавив версию обработки результатов, если это необходимо. Например, у нас есть файл, который читает и записывает все данные целиком, но вы можете создавать потоковые скрипты для огромных файлов.

const fs = require('fs');

const initialFilePath = 'sample_data.csv';
const outputFilePath = 'sample_script.sh';

const amountOfParallelRequests = 5; // Remember about the throughput and the bandwidth of your services
const delimiterForCSV = ',';

// Read the initial file and split it by lines
// You could transform it to an object if it's relevant to your situation
let initialFile = fs.readFileSync(initialFilePath).toString().split('n');

// Prepare boilerplate for sh script
let outputString = '#!/bin/bashnn';

// Write data with parallel execution
// Skip header for CSV
// The code for parallel requests was received from https://serverfault.com/questions/456490/execute-curl-requests-in-parallel-in-bash
// and you could implement your version instead
for (let i = 1; i < initialFile.length; i++){
    let line = initialFile[i];

    if (!line) {
        continue;
    }

    let processedLine  = line.split(delimiterForCSV); // We don't implement processing of errors here
    // Let's suggest that the necessary for request value lies in second column
    let desiredValue = processedLine[1];

    if (desiredValue === undefined) {
        console.error('We have a trouble ' + line);
    }

    outputString += `curl -s -o foo http://example.com/file${desiredValue} && echo "done with ${desiredValue}"  &n`;

    if (i % amountOfParallelRequests === 0 || i === initialFile.length - 1) {
        outputString += 'nwaitnn';
    }
}

fs.writeFileSync(outputFilePath, outputString);

// Indicate the success
console.log('Success');

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

Знания

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

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

Как отложить оповещения? После анализа инцидента часто выходит, что текущая авария может ждать до утра, поэтому хорошо бы понять, как отложить оповещение. Не закрыть, потому что в случае каких-то операций вас уведомят еще раз, а именно отложить. Вы должны не забыть разобраться и исправить ситуацию или предупредить, как только вы начнете свой обычный рабочий день.

Где находятся контакты или как вы связываетесь с коллегами или членами других команд? В голове должен быть четкий инструмент или знания - кто понимает/должен знать о ситуации, когда она произошла. Эксперты могут помочь вам решить инцидент, а заинтересованные стороны должны знать, что что-то идет не так. У вас должен быть доступ к их контактам, в идеале к их телефону, потому что многие люди отключают уведомления из офисных чатов в нерабочее время.

Как получить доступ к производственной/базе данных и расширить доступ, если существуют уровни доступа? Если у вас нет доступа, вам нужно знать, к кому обратиться и что делать, чтобы получить желаемый доступ.

Как быстро запустить код в работу? Иногда проблемы требуют быстрого изменения кода службы в продакшене. В целом это справедливо считается плохой практикой, но часто в экстренных случаях это не так. Иногда вы не хотите ждать длительных тестов E2E, но вам нужно быстро получить код в рабочей среде. Я хотел бы, чтобы вы поняли, как это сделать.

Какие данные хранятся в базе данных? Существуют ли схемы перемещения данных внутри продукта и между сервисами? Если вам нужно взаимодействовать с базой данных, полезно знать, как данные организованы в том или ином сервисе, откуда они берутся и кто их использует. Это позволит вам решать проблемы, если они есть, раньше.

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

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

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

Где находятся контакты или как вы связываетесь с коллегами или членами других команд? В голове должен быть точный инструмент или знание - кто понимает/должен знать о ситуации, когда она произошла. Эксперты могут помочь вам решить инцидент, а заинтересованные стороны должны знать, что что-то идет не так. У вас должен быть доступ к их контактам, в идеале к их телефону, потому что многие люди отключают уведомления из офисных чатов в нерабочее время.

Как получить доступ к производственной/базе данных и расширить доступ, если существуют уровни доступа? Если вам нужен доступ, вы должны знать, к кому обращаться и что делать, чтобы получить желаемый доступ.

Как быстро запустить код в работу? Иногда проблемы требуют быстрого изменения кода службы в продакшене. В целом это справедливо считается плохой практикой, но часто в экстренных случаях это не так. Иногда вы хотите быстро получить код в рабочей среде перед долгими E2E-тестами. Я хотел бы, чтобы вы поняли, как это сделать.

Какие данные хранятся в базе данных? Существуют ли схемы перемещения данных внутри продукта и между сервисами? Если вам нужно взаимодействовать с базой данных, полезно знать, как данные организованы в том или ином сервисе, откуда они берутся и кто их использует. Это позволит вам решать проблемы, если они есть, раньше.

Заключение

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

Полезные ссылки

https://zach-gollwitzer.medium.com/the-ultimate-bash -crash-course-cb598141ad03

https://www.youtube.com/watch?v=oxuRxtrO2Ag

https://www.postgresguide.com/utilities/psql/

https://www.mongodb.com/docs/mongodb-shell/


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE