Мониторинг веб-сервисов
Для контроля работы веб-сервисов используется анализ логов IIS, используем ELK и zabbix.
1. Натравливаем filebeat на логи IIS. Отправляем данные о работе публикаций в индекс Elasticsearch.
Пример filebeat.yml для логов IIS
###################### Filebeat Configuration #########################
# ============================== Filebeat modules ==============================
filebeat.modules:
- module: iis
access:
enabled: true
var.paths:
- C:/inetpub/logs/LogFiles/W3SVC*/u_ex*.log
error:
enabled: true
var.paths:
- C:/inetpub/logs/LogFiles/W3SVC*/u_ex*.log
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
# =============================== Template =====================================
setup.template.settings:
index.number_of_shards: 1
# =============================== Output: Logstash ==============================
output.logstash:
hosts: ["host-elk:port"]
ssl:
enabled: false
# =============================== Processors ===================================
processors:
- add_host_metadata: {}
- add_cloud_metadata: {}
- add_fields:
target: ""
fields:
logsource: "iis"
# =============================== Logging =======================================
logging.level: info
logging.to_files: true
logging.files:
path: C:/ProgramData/filebeat/logs
name: filebeat
keepfiles: 7
permissions: 0644
2. Внешним скриптом на python проверяем из zabbix данные и настраиваем триггер.
Пример скрипта
from elasticsearch import Elasticsearch
import time
import json
import pandas as pd
import datetime
import urllib3
import config
from sqlalchemy import create_engine, inspect, text
from datetime import timezone
import sys
sys.stdout.reconfigure(encoding='utf8')
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
es_str = 'https://usr:passG@elk-server:9200/'
index_pattern = '*log-iis*'
delta_time = "now-20m"
def connect_elasticsearch():
_es = Elasticsearch(
[es_str],
use_ssl=True,
verify_certs=False,
ssl_show_warn=False
)
return _es
def search(es_object, index_name, search):
res = es_object.search(index=index_name, body=search, size=10000)
return res
if __name__ == '__main__':
try:
start = datetime.datetime.now()
logger.info(f'{start} - {index_pattern} start')
es = connect_elasticsearch()
search_object = {
"query": {
"bool": {
"filter": [
{
"range": {
"@timestamp": {
"gte": delta_time,
"lte": "now"
}
}
},
]
}
}
}
esss = search(es, index_pattern, json.dumps(search_object))
df = pd.DataFrame.from_dict(pd.json_normalize(esss['hits']['hits']), orient='columns')
df = df[df['_source.url.path'] == '/DB/ws/service']
df = df.drop_duplicates(subset=['_source.event.original'], keep='first')
if df.shape[0] > 0 and df['_source.time_taken'].mean() > 2000:
print('Среднее время обращения к сервису service за последние 20 минут больше 2 секунд')
else:
print(1)
except Exception as err:
print(err)
3. При срабатывании триггера отправляем аларм в telegram из zabbix

Мониторинг состояния базы при помощи rac
1. В zabbix внешним скриптом проверяем параметры базы в кластере 1С. Пример скрипта
import subprocess
rac_path = "C:\\Program Files\\1cv8\\8.3.XX.XXXX\\bin\\rac.exe"
sessions_info = subprocess.Popen(
f'"{rac_path}" infobase info --infobase=base_guid --infobase-user=user --infobase-pwd=pass --cluster=cluster_guid server_ras:1545',
stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
(output, err) = sessions_info.communicate()
if err:
print(err)
else:
text = output.decode(encoding='cp866')
if 'scheduled-jobs-deny : off' in text:
print(1)
else:
print("В настройках базы выключены регламентные задания")
2. Настраиваем триггер, при его срабатывании получаем сообщение в telegram

Прямые запросы в БД
1. Настраиваем элемент данных прям в zabbix
В качестве ключа указываем такие данные
db.odbc.select[item_key,,"Driver=MSSQL;Server=server_db;Port=1433"]
Выполняем нужный нам запрос, например
SELECT count([session_id])
FROM [Indicator].[dbo].[clst1c_session]
WHERE [duration_current] > 20000
AND [_eventdate] > dateadd(mi, datediff(mi, 0, getdate()) - 1, 0)
AND [app_id] = '1CV8C'
[user_name] NOT LIKE '%Формирование%'
AND [infobase] = 'base_guid'
2. Настраиваем триггер и, при его срабатывании, получаем сообщение в telegram

Это довольно полезный показатель. Он четко сигнализирует о проблемах с производительностью базы.
Здесь надо учитывать, что в базе, к которой мы делаем запрос, уже аккуратно лежат данные, ежеминутно получаемые запросами rac.
Вступайте в нашу телеграмм-группу Инфостарт