Graphite — Ubuntu установка

 

Данная статья актуальна для Ubuntu 18.04, на 20.04 на момент (23.02.2021) наблюдается баг при попытке выполнить миграции

 

Обновляем список пакетов и устанавливаем Graphite:

sudo apt update
sudo apt install -y graphite-web graphite-carbon

 

Редактируем файл конфигурации:

sudo vim /etc/graphite/local_settings.py

 

Редактируем следующие строки:

SECRET_KEY = 'ranDomvALuE' - вводим случайное значение 
TIME_ZONE = 'Europe/Kiev' - вводим свой часовой пояс

 

Выполняем миграции:

sudo -u _graphite graphite-manage migrate --noinput
sudo graphite-manage migrate --run-syncdb

Включаем автозагрузку:

sed -i 's/false/true/g' /etc/default/graphite-carbon

 

Перезапускаем "carbon-cache":

systemctl restart carbon-cache

 

Устанавливаем Nginx и uWSGI для Web UI:

sudo apt install -y nginx uwsgi uwsgi-plugin-python

 

Редактируем дефолтный конфиг Nginx'a:

sudo bash -c 'cat << EOF > /etc/nginx/sites-enabled/default
server {
    listen 80 default_server;

    server_name _;

    root /usr/share/graphite-web;

    access_log /var/log/nginx/graphite.access.log;
    error_log  /var/log/nginx/graphite.error.log;

    location = /favicon.ico {
        return 204;
    }

    # serve static content from the "content" directory
    location /static {
        alias /usr/share/graphite-web/static;
        expires max;
    }

    location / {
        try_files \$uri @graphite;
    }

    location @graphite {
        uwsgi_pass  127.0.0.1:3031;
        include uwsgi_params;
    }
}
EOF'

 

Создаем uWSGI конфиг:

sudo bash -c 'cat << EOF > /etc/uwsgi/apps-enabled/grafite.ini
[uwsgi]
processes = 2
socket = 127.0.0.1:3031
gid = _graphite
uid = _graphite
wsgi-file = /usr/share/graphite-web/graphite.wsgi
EOF'

 

Перезапускаем uWSGI и Nginx:

sudo systemctl restart uwsgi
sudo systemctl restart nginx

EKS — RollingUpdate с запуском pod’а на том же инстансе

Необходимо выполнить обновление пода без даунтайма, но у пода есть volume, который является EBS, и может быть приатачен одновременно только к одному из EC2 инстансов. Поэтому необходимо, чтобы под был запущен на той же ноде, для этого можно воспользоваться "podAffinity"

deployment.yaml

spec:
...
  strategy:
    type: RollingUpdate
  template:
    metadata:
      labels:
        app: artem-services
    spec:
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - artem-services
            topologyKey: "kubernetes.io/hostname"

FIX ERROR — EKS: error: You must be logged in to the server (Unauthorized)

После создания EKS кластера при попытке использовать kubectl, появилась такая ошибка:

error: You must be logged in to the server (Unauthorized)

 

Решение:

aws eks update-kubeconfig --name artem-eks-staging

 

Где "artem-eks-staging" — имя вашего кластера

Так же не забудьте указать правильный AWS Region

FIX ERROR — Postgres: cannot execute ALTER DATABASE in a read-only transaction

При попытке вернуть в режим "read-write" командой:

ALTER DATABASE dababase_name SET default_transaction_read_only = false;

 

Получаю ошибку:

ERROR: cannot execute ALTER DATABASE in a read-only transaction

 

Решение:

Используя psql подключаемся к базе и выполняем:

begin;
set transaction read write;
alter database dababase_name set default_transaction_read_only = off;
commit;

 

Отключаемся от базы и подключаемся, и снова выполняем:

ALTER DATABASE dababase_name SET default_transaction_read_only = false;

 

Проверяем:

SELECT name, setting FROM pg_settings WHERE name = 'default_transaction_read_only';

AWS AMI Linux 2 — Logstash

 

Для установки Logstash нужна установленная Java OpenJDK

Устанавливаем Java OpenJDK:

amazon-linux-extras install java-openjdk11

 

Импортируем ключ репозитория:

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

 

И добавляем репозиторий:

cat > /etc/yum.repos.d/logstash.repo << EOF
[logstash-7.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
EOF

 

Устанавливаем Logstash:

yum install logstash

 

После установки на AMI Linux 2 не будет Systemd сервиса.

Создадим его:

/usr/share/logstash/bin/system-install

 

Запускаем сервис и проверяем статус:

systemctl start logstash
systemctl status logstash

 

Добавляем в автозапуск:

systemctl enable logstash

MacOS — iTerm2: удалить слово/строку

Удаление слова до разделителя (alt+backspace в линуксе)

Переходим в "Preferences" -> "Profiles" -> "YOUR_PROFILE_NAME" -> "Keys"

И создадим новый "Keyboard Shortcut":
Тип: Send Hex Codes
Код: 0x1B 0x08

Удалить слово, не учитывая разделители:

Тип: Send Hex Codes
Код: 0x17

 

Удалить всю строку:

Тип: Send Hex Codes
Код: 0x15

FIX ERROR — carbon-cache: whisper.CorruptWhisperFile: Unable to read header

В логе "console.log" сервиса "carbon-cache" появились следующие ошибки:

31/01/2020 05:57:45 :: Error writing to production.xxxxxxxxxx.yyyyyyyyyy.p10._S1_.field_data_01.xxx.yyy.t3.10-0.3-0: Unable to read header (/mnt/graphite/data/production/xxxxxxxxxx-yyyyyyyyyy/xxxxxxxxxxx/p10/_S1_/field_data_01/xxx/yyy_001/t3/10-0/3-0.wsp)
31/01/2020 05:57:46 :: Unhandled Error
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/twisted/python/threadpool.py", line 266, in <lambda>
    inContext.theWork = lambda: context.call(ctx, func, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 122, in callWithContext
    return self.currentContext().callWithContext(ctx, func, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/twisted/python/context.py", line 85, in callWithContext
    return func(*args,**kw)
  File "/usr/lib/python2.7/dist-packages/carbon/writer.py", line 149, in writeForever
    writeCachedDataPoints()
--- <exception caught here> ---
  File "/usr/lib/python2.7/dist-packages/carbon/writer.py", line 128, in writeCachedDataPoints
    state.database.write(metric, datapoints)
  File "/usr/lib/python2.7/dist-packages/carbon/database.py", line 100, in write
    whisper.update_many(path, datapoints)
  File "/usr/lib/python2.7/dist-packages/whisper.py", line 694, in update_many
    return file_update_many(fh, points)
  File "/usr/lib/python2.7/dist-packages/whisper.py", line 701, in file_update_many
    header = __readHeader(fh)
  File "/usr/lib/python2.7/dist-packages/whisper.py", line 267, in __readHeader

 

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

grep 'Error writing to ' /var/log/carbon/console.log | awk '{print $NF}' |sort -u | xargs rm -f

CloudWatch Logs — Insights: Поиск по содержимому

Запрос, для вывода логов, содержащих строку "artem.services" и ограничением в 200 сообщений для отображения результатов.

fields @timestamp, @message
| filter @message like /artem.services/
| sort @timestamp desc
| limit 200

 

Результат:

Prometheus — Redis Exporter

 

Redis Exporter

Создадим в системе пользователя и группу "prometheus", если их нет в системе, от которого будем запускать экспортер:

groupadd --system prometheus
useradd -s /sbin/nologin --system -g prometheus prometheus

 

Переходим по ссылке и скачиваем актуальную версию:

wget https://github.com/oliver006/redis_exporter/releases/download/v1.3.5/redis_exporter-v1.3.5.linux-amd64.tar.gz

 

Разархивируем:

tar -xf redis_exporter-v1.3.5.linux-amd64.tar.gz

 

Копируем бинарный файл:

cp -a redis_exporter-v1.3.5.linux-amd64/redis_exporter /usr/local/bin/

 

Удаляем архив и директорию с Redis Exporter:

rm -rf redis_exporter-v1.3.5.linux-amd64.tar.gz
rm -rf redis_exporter-v1.3.5.linux-amd64

 

Создадим сервис для Redis Exporter'а:

cat >/etc/systemd/system/redis_exporter.service << EOF
[Unit]
Description=Prometheus Redis Exporter
After=network.target

[Service]
Type=simple
Restart=always
User=prometheus
Group=prometheus
ExecStart=/usr/local/bin/redis_exporter -include-system-metrics
[Install]
WantedBy=multi-user.target
EOF

 

Перечитываем демонов:

systemctl daemon-reload

 

Добавляем в автозагрузку и запускаем:

systemctl enable redis_exporter
systemctl start redis_exporter

 

Проверим работу службы:

	
systemctl status redis_exporter

 

Prometheus

Пример конфигурации для сбора Redis метрик с сервера, где установлен Prometheus:

/etc/prometheus/prometheus.yml

 

	
scrape_configs:
- job_name: "prometheus"
  static_configs:
  - targets: ['localhost:9090']
- job_name: "redis"
  static_configs:
  - targets:
    - "localhost:9121"
    labels:
      host: redis

Перечитываем конфигурацию Prometheus’а:

	
systemctl reload prometheus

 

Grafana

Для Grafana есть готовый дашборд

AWS AMI Linux 2 — redis-stat

Для установки redis-stat нужен ruby версии > 2.0

Сморим список доступных репозиториев:

amazon-linux-extras list

 

Подключаем репозиторий с "ruby2.6":

amazon-linux-extras enable ruby2.6

 

Устанавливаем зависимости:

yum clean metadata
yum install -y ruby ruby-irb rubygem-rake rubygem-json rubygems ruby-devel
yum groupinstall -y 'Development Tools'

 

Устанавливаем "redis-stat":

gem install redis-stat

 

redis-stat можно запустить не только, как консольную утилиту, а веб сервис:

redis-stat redis.artem.services:6379 --verbose --server=8080 --daemon

 

После чего на порту "8080" будет доступен "redis-stat"