Coder Social home page Coder Social logo

arkuznetsov / hirac Goto Github PK

View Code? Open in Web Editor NEW
41.0 4.0 15.0 329 KB

REST API для получения информации о кластере сервера 1С и управления объектами кластера

License: Mozilla Public License 2.0

1C Enterprise 99.50% Batchfile 0.13% Dockerfile 0.20% Shell 0.18%
1c 1c-enterprise onescript oscript bsl mssql oscript-web rac ras onescript-web

hirac's Introduction

GitHub release GitHub license GitHub Releases GitHub All Releases

Build Status Quality Gate Coverage Tech debt

Checked by Silver Bulleters SonarQube BSL plugin

HTTP interface for RAC (HiRAC)

REST API для получения информации о кластере сервера 1С и управления объектами кластера.

Требования

Требуются следующие библиотеки и инструменты:

  • OneScript.Web - MVC фреймворк для разработки веб-сайтов с использованием OneScript
  • irac - если установлен OneScript устанавливается командой opm install -l
  • cpdb - если установлен OneScript устанавливается командой opm install -l
  • 1C RAC - утилита RAC из состава платформы 1С:Предприятие 8.3

Запуск

Перейти в подкаталог src и запустить OneScript.Web:

cd <путь к hirac>\src
<путь к OneScript.Web>\OneScript.WebHost.exe

Запуск будет выполнен на 5005 порту. Изменить порт можно в файле настроек appsettings.json

Настройки MS SQL Server для получения информации о базах и таблицах

Создание имени для входа (Login)


На сервере MS SQL, где расположены базы 1С создать имя для входа "_1Cmonitor" (имя может быть любым) с ролью "Public" и дополнительными правами:

  • Connect SQL,
  • Connect Any Database,
  • View any database,
  • View server state.

Указать способ аутентификации: SQL Server authentification.

Добавление прав на чтение данных баз 1С


Для кажой базы 1С, для которой требуется получать информацию об использовании и таблицах создать пользователя "_1Cmonitor" (имя может быть любым) и связать его с именем для входа "_1Cmonitor". В свойствах базы назначить этому пользователю право SELECT.

Или использовать скрипт для назначения прав для всех баз 1С, зарегистрированных на сервере:

Имя для входа и пользователя можно изменить в переменной @monitorUserName (при необходимости поправить длину имени в определении).

DECLARE @monitorUserName NVARCHAR(10);
SET @monitorUserName = '_1Cmonitor';

DECLARE @command NVARCHAR(1000);
SELECT @command = '
DECLARE @is1cbase BIT;
SELECT @is1cbase = COUNT(Tables.name) FROM ?.sys.tables AS Tables WHERE Tables.name = ''v8users''

IF (@is1cbase = 1)
BEGIN
	USE ?
	DECLARE @hasMonitorUser BIT;
	SELECT @hasMonitorUser = COUNT(Principals.name) FROM ?.sys.database_principals AS Principals WHERE Principals.name = ''' + @monitorUserName + '''

	IF (@hasMonitorUser = 0)
	BEGIN
		CREATE USER [' + @monitorUserName + '] FOR LOGIN [' + @monitorUserName + '] WITH DEFAULT_SCHEMA=[dbo]
	END

	GRANT SELECT ON DATABASE::[?] TO [' + @monitorUserName + '];
END
'

EXEC sp_MSforeachdb @command

Конфигурация HiRAC (./src/config/racsettings.json)

  • ras - параметры сервера администрирования RAS
    • <имя сервера администрирования> - параметры конкретного сервера администрирования RAS (__default для значений по умолчанию)
      • admin_name - имя администратора агента кластера
      • admin_pwd - пароль администратора агента кластера
      • ras - адрес сервера администрирования RAS
      • rac - версия утилиты администрирования RAC
      • reserves - резервируемый сервер администрирования
  • cluster - параметры кластеров 1С
    • <имя кластера:порт> - параметры кластера (rmngr) по указанному адресу:порту (__default для значений по умолчанию)
      • selectedInfobasesOnly - true - получать информацию только о перечисленных информационных базах
      • admin_name - имя администратора кластера
      • admin_pwd - пароль администратора кластера
        • infobase - параметры информационных баз в кластере
          • <Имя ИБ> - параметры информационной базы (__default для значений по умолчанию)
            • admin_name - имя администратора ИБ
            • admin_pwd - пароль администратора ИБ
            • dbms_type - тип СУБД (в настоящий момент только "MSSQLServer")
            • dbms_server - адрес сервера СУБД
            • dbms_user - имя пользователя для получения информации от СУБД
            • dbms_pwd - пароль пользователя для получения информации от СУБД
            • dbms_base - имя базы данных в СУБД
            • dbms_dbstruct_lifetime - период актуальности структуры хранеения базы данных
            • dbms_db_lifetime - период актуальности информации о базе данных в СУБД
            • dbms_tables_lifetime - период актуальности информации о таблицах в СУБД
  • useCommands - true - включена возможность выполнения команд управления кластером; false -возможность отключена
  • dbms_dbstruct_cache - каталог для хранения кэша структуры данных баз СУБД
  • selectedClustersOnly - true - получать информацию только о перечисленных кластерах
  • connectionPoolSize - число одновременных подключений к сервису администрирования
  • reconnectAtempts - количество попыток инициализации кластера 1С
  • reconnectInterval - задержка перед повторным подключением (мсек.) умножается на номер попытки подключения
  • connectionWait - время ожидания свободного подключения (мсек.), после которого будет сообщено об ошибке подключения
  • connectionLockInterval - максимальное время блокировки подключения (мсек.), после которого подключение будет принудительно освобождено
  • logQueryDuration- true - будет выполняться логирование времени выполнения запросов в файл
  • QueryDurationLogFilename - путь к файлу лога замеров времени

Регистрация в качестве службы

В командный файл reg_os_web_as_service.cmd регистрации HiRAC в качестве сервиса Windows. Запуск:

reg_os_web_as_service.cmd <путь к OneScript.Web>\OneScript.WebHost.exe <адрес>:<порт> <путь к hirac>\src

Варианты запросов

  • <тип объектов>/list - список объектов
  • <тип объектов>/<путь к объекту> - содержимое объекта по указанному пути
  • <тип объектов>/<путь к объекту>/<свойство> - значение свойства <свойство> объекта по указанному пути
  • counter/list - описания доступных счетчиков
  • counter/<тип объектов>/list - описания доступных счетчиков для <тип объектов>
  • counter/<тип объектов>/<счетчик> - значения счетчика <счетчик> для <тип объектов>

Используемые имена объектов (<тип объектов>)

  • cluster - информация о кластерах
  • server - информация о рабочих серверах
  • process - информация о рабочих процессах
  • infobase - информация об информационных базах
  • session - информация о сеансах
  • connection - информация о соединениях

Используемые типы объектов (<путь к объекту>)

  • cluster - cluster/<адрес сервера>/<порт сервера> или cluster/<идентификатор>
  • server - server/<адрес сервера>/<порт сервера> или server/<идентификатор>
  • process - process/<адрес сервера>/<порт процесса> или process/<идентификатор>
  • infobase - infobase/<имя информационной базы> или infobase/<идентификатор>
  • session - session/<имя информационной базы>/<номер сеанса> или session/<идентификатор>
  • connection - connection/<имя информационной базы>/<номер сеанса> или connection/<идентификатор>

Доступные поля запросов

Доступные поля запроса списка (<имя объекта>/list)

  • field - имя поля запрашиваемого объекта, которое попадет в результат (field=_all - попадут все поля)
  • filter_<поле объекта>_<операция сравнения> - условие (фильтр) по значению поля
  • order - сортировка по значениям полей
  • top - отбор указанного количества первых результатов с учетом порядка сортировки order

Доступные поля запроса счетчиков (counter/<имя объекта>)

  • filter_<поле объекта>_<операция сравнения> - условие (фильтр) по значению поля
  • dim - имя измерения счетчика по которым выполняется свертка значения счетчика (dim=_all - попадут все измерения счетчика)
  • top - отбор указанного количества первых значений счетчика с максимальным значением
  • aggregate - агрегатная функция свертки значений счетчика
  • format - формат вывода результата

Доступные операции сравнения фильтров

  • eq - равно (может не указываться), для строк выполняется без учета регистра
  • neq - не равно, для строк выполняется без учета регистра
  • gt - больше
  • gte - больше или равно
  • lt - меньше
  • lte - меньше или равно
  • sw - начинается с
  • ew - заканчивается на
  • cnt - содержит
  • mre - соответствует регулярному выражению

Доступные агрегатные функции свертки значений счетчиков

  • count - количество значений счетчика
  • distinct - количество различных значений счетчика
  • sum - сумма значений счетчика
  • min - минимальное значение счетчика
  • max - максимальное значение счетчика
  • avg - среднее значение счетчика

Доступные форматы

  • json - (по умолчанию) JSON-текст собственной структуры
  • prometheus - формат Prometheus
  • plain - плоский текстовый формат без указания значений измерений

Примеры запросов:

Получение списка кластеров


http://localhost:5005/cluster/list

Серверы

Получение списка серверов


http://localhost:5005/server/list

Информационные базы

Получение списка ИБ


http://localhost:5005/infobase/list

Сеансы

Получение списка сеансов


http://localhost:5005/session/list

Счетчики

Получение списка счетчиков


http://localhost:5005/counter/list

Получение всех счетчиков сеансов

Развернуто по всем измерениям


http://localhost:5005/counter/session

или

http://localhost:5005/counter/session?dim=_all

В формате Prometheus


http://localhost:5005/counter/session?format=prometheus

Свернуто по всем измерениям

Агрегатная функция по умолчанию (count)


http://localhost:5005/counter/session?dim=_no

Агрегатная функция СУММА (sum)


http://localhost:5005/counter/session?dim=_no&aggregate=sum

Получение конкретного счетчика сеансов

Развернуто по всем измерениям


http://localhost:5005/counter/session/count?dim=_all

С отбором по типу клиента


http://localhost:5005/counter/session/count?filter_app_id=Designer

Свернуто по хосту и ИБ

Агрегатная функция СУММА (sum)


http://localhost:5005/counter/session/count?dim=host&dim=infobase&aggregate=sum

Запуск в docker

Сборка образа с hirac

  1. Так как для работы приложения необходима консольная утилита rac. а ее распространение ограниченно лицензией 1С, то для сборки образа нам необходима актуальная учетная запись на https://users.v8.1c.ru/. В момент сборки будет скачан необходимый нам дистрибутив платформы.

Для этого необходимо создать файл переменных .env в корне репозитария, по примеру env.example и заполнить его правильными значениями


ONEC_USERNAME=<ПОЛЬЗОВАТЕЛЬ_USERS.1C.V8.RU>
ONEC_PASSWORD=<ПАРОЛЬ_ОТ_USERS.1C.V8.RU>
ONEC_VERSION=8.3.14.1993
OSCRIPT_VERSION=1.5.0

  1. Запустить скрипт сборки образов. При необходимости первым параметром можно указать тег собираемого образа. Тег по умолчанию - oscript/hirac:latest

bash build_images.sh

Запуск контейнера hirac

Пример конфигурационного файла hirac лежит в каталоге src/config/racsettings.json, он же применяется по умолчанию при запуске контейнера. При необходимости использовать свои параметры необходимо переопределить конфигурационный файл, через подключеннный volume:


docker run -d -p 5000:5000 -v $(pwd)/src/config/racsettings.json:/app/config/racsettings.json demoncat/hirac:latest

hirac's People

Contributors

arkuznetsov avatar thedemoncat avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

hirac's Issues

Некорректный entrypoint

В Dockerfile указан entrypoint
ENTRYPOINT ["/var/osp.net/artifact/core/linux-x64/OneScript.WebHost"]

Но на самом деле такого файла там нет, а есть файл:
ENTRYPOINT ["/var/osp.net/OneScript.WebHost"]

Не могу настроить hirac

Не могу настроить hirac, действую по инструкции, конфиг дефолтный, через rac.exe и irac - работает, опрашивается.
Пробовал на Windows и Linux.
Пробовал разные релизы 1с, в данный момент 8.3.22.1709.
Оскрипт - 1.8.3.
OneScript.Web 0.9.1.

При попытке обратиться по ссылке http://127.0.0.1:5005/cluster/list заканчивается ошибкой:

`
An unhandled exception occurred while processing the request.
RuntimeException: {Модуль C:\Users\user\Desktop\1c\hirac\src\oscript_modules\fluent\src\internal\Модули\ПроцессорыКоллекцийСлужебный.os / Ошибка в строке: 115 / Неверное значение аргумента}
ЭтоФункция = Интерфейс.ПолучитьКартуИнтерфейса()[0].ЭтоФункция;

ScriptEngine.HostedScript.Library.ValueTable.ValueTable.Get(int index)

Stack Query Cookies Headers Routing 

RuntimeException: {Модуль C:\Users\user\Desktop\1c\hirac\src\oscript_modules\fluent\src\internal\Модули\ПроцессорыКоллекцийСлужебный.os / Ошибка в строке: 115 / Неверное значение аргумента} ЭтоФункция = Интерфейс.ПолучитьКартуИнтерфейса()[0].ЭтоФункция;
    ScriptEngine.HostedScript.Library.ValueTable.ValueTable.Get(int index)
    ScriptEngine.HostedScript.Library.ValueTable.ValueTable.GetIndexedValue(IValue index)
    ScriptEngine.Machine.Variable+VariableReference.get_DataType()
    ScriptEngine.Machine.MachineInstance.ResolveProp(int arg)
    ScriptEngine.Machine.MachineInstance.MainCommandLoop()
    ScriptEngine.Machine.MachineInstance.ExecuteCode()
    ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, int methodIndex, IValue[] arguments)
    ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallAsFunction(int methodNumber, IValue[] arguments, out IValue retValue)
    ScriptEngine.Machine.MachineInstance.ResolveMethodFunc(int arg)
    ScriptEngine.Machine.MachineInstance.MainCommandLoop()
    ScriptEngine.Machine.MachineInstance.ExecuteCode()
    ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, int methodIndex, IValue[] arguments)
    ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallScriptMethod(int methodIndex, IValue[] parameters)
    ScriptEngine.Machine.Contexts.UserScriptContextInstance.OnInstanceCreation()
    ScriptEngine.Machine.Contexts.AttachedScriptsFactory.ScriptFactory(string typeName, IValue[] arguments)
    ScriptEngine.Machine.MachineInstance.NewInstance(int argCount)
    ScriptEngine.Machine.MachineInstance.MainCommandLoop()
    ScriptEngine.Machine.MachineInstance.ExecuteCode()
    ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, int methodIndex, IValue[] arguments)
    ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallAsFunction(int methodNumber, IValue[] arguments, out IValue retValue)
    ScriptEngine.Machine.MachineInstance.ResolveMethodFunc(int arg)
    ScriptEngine.Machine.MachineInstance.MainCommandLoop()
    ScriptEngine.Machine.MachineInstance.ExecuteCode()
    ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, int methodIndex, IValue[] arguments)
    ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallAsFunction(int methodNumber, IValue[] arguments, out IValue retValue)
    ScriptEngine.Machine.MachineInstance.ResolveMethodFunc(int arg)
    ScriptEngine.Machine.MachineInstance.MainCommandLoop()
    ScriptEngine.Machine.MachineInstance.ExecuteCode()
    ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, int methodIndex, IValue[] arguments)
    ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallScriptMethod(int methodIndex, IValue[] parameters)
    ScriptEngine.Machine.Contexts.UserScriptContextInstance.OnInstanceCreation()
    ScriptEngine.Machine.Contexts.AttachedScriptsFactory.ScriptFactory(string typeName, IValue[] arguments)
    ScriptEngine.Machine.MachineInstance.NewInstance(int argCount)
    ScriptEngine.Machine.MachineInstance.MainCommandLoop()
    ScriptEngine.Machine.MachineInstance.ExecuteCode()
    ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, int methodIndex, IValue[] arguments)
    ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallScriptMethod(int methodIndex, IValue[] parameters)
    ScriptEngine.Machine.Contexts.UserScriptContextInstance.OnInstanceCreation()
    ScriptEngine.Machine.Contexts.AttachedScriptsFactory.ScriptFactory(string typeName, IValue[] arguments)
    ScriptEngine.Machine.MachineInstance.NewInstance(int argCount)
    ScriptEngine.Machine.MachineInstance.MainCommandLoop()
    ScriptEngine.Machine.MachineInstance.ExecuteCode()
    ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, int methodIndex, IValue[] arguments)
    ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallScriptMethod(int methodIndex, IValue[] parameters)
    ScriptEngine.Machine.Contexts.UserScriptContextInstance.OnInstanceCreation()
    ScriptEngine.Machine.Contexts.AttachedScriptsFactory.ScriptFactory(string typeName, IValue[] arguments)
    ScriptEngine.Machine.MachineInstance.NewInstance(int argCount)
    ScriptEngine.Machine.MachineInstance.MainCommandLoop()
    ScriptEngine.Machine.MachineInstance.ExecuteCode()
    ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, int methodIndex, IValue[] arguments)
    ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallAsFunction(int methodNumber, IValue[] arguments, out IValue retValue)
    ScriptEngine.Machine.MachineInstance.ResolveMethodFunc(int arg)
    ScriptEngine.Machine.MachineInstance.MainCommandLoop()
    ScriptEngine.Machine.MachineInstance.ExecuteCode()
    ScriptEngine.Machine.MachineInstance.ExecuteMethod(IRunnable sdo, int methodIndex, IValue[] arguments)
    ScriptEngine.Machine.Contexts.ScriptDrivenObject.CallAsFunction(int methodNumber, IValue[] arguments, out IValue retValue)
    ScriptEngine.Machine.Contexts.ReflectedMethodInfo.InvokeDirect(IRuntimeContextInstance instance, IValue[] parameters)
    OneScript.WebHost.Application.ScriptedController.ResultAction() in ScriptedController.cs
    lambda_method(Closure , object , object[] )
    Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(object target, object[] parameters)
    Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor+SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object[] arguments)
    Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeActionMethodAsync>g__Logged|12_1(ControllerActionInvoker invoker)
    Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.<InvokeNextActionFilterAsync>g__Awaited|10_0(ControllerActionInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
    Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
    Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
    Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResourceFilter>g__Awaited|24_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, object state, bool isCompleted)
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSealed context)
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync()
    Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Logged|17_1(ResourceInvoker invoker)
    Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
    Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

`

ЧЯДНТ?

Проблема с запуском в kubernetes

При запуске образа в k8s (версия 1.20, рантайм containerd) возникает проблема:

Unhandled exception. ScriptEngine.Compiler.SymbolNotFoundException: {Модуль /app/model/modules/ПодключенияКАгентам.os / Ошибка в строке: 34,37 / Неизвестный символ: ТипыОбъектовКластера}
        ПоляОбъекта = ТипыОбъектовКластера.СвойстваОбъекта(ТипОбъекта);

проблема возникает при инициализации пода, то есть под (контейнер) падает.

Не обновляется кэш описания информационных баз, если нет соединения с СУБД

Описание проблемы

Использую hirac на машине, где вообще не установлена какая-либо СУБД. RAS запущен на этой же машине, но смотрит он на кластер, расположенный на другом сервере.

racsettings.json по умолчанию.

Обработка запроса списка сессий происходит довольно долго, около 15 секунд. В ответе на запрос нет нормального представления информационной базы

hirac_none

Причина

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

Надеюсь понятно описал ))

Отсутствие образа evilbeaver/oscript-web:latest

Был день в феврале, когда на хабе отсутствовал образ с тегом latest.
Не было возможности собрать образ, приходилось вручную прописывать.
Было бы неплохо, все-таки использовать стабильную версию, а не latest.

Добавить возможность предварительной фильтрации объектов кластера

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

http://localhost:5005/infobase/list?filter_label=Alexander&field=_all

Происходит это из-за того, что фильтр по полям срабатывает уже после получения всей информации по объектам. Для каждой базы в кластере сначала вызывается функция ЗаполнитьРасширенноеОписаниеОбъекта, а уже после работает фильтр.
Если у пользователя нет прав на какие-нибудь базы, это еще замедляет выполнение запроса и приводит вот к таким ошибкам:
err

Хотелось бы иметь следующую функциональность
Хотелось бы, чтобы была возможность предварительной фильтрации объектов, например, по идентификатору или представлению. Это ускорило бы получение информации по конкретному объекту, в частности по конкретной информационной базе.

prometeus provider

я как инженер по инфраструктуре хочу иметь "дырку" для подключения прометея

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

cat prometeus-server.yaml
scrape_configs:
- job_name: hirac-job
  static_configs:
  - targets: ['hirac-host:9091']
  scrape_interval: 1s

пока мысли такие, чтобы пробросить это дело в OScript.Web - то есть обернуть метод например отсюда https://github.com/prometheus-net/prometheus-net

в некую фигню типа

ИмяМетрикиАнгл = "licence-count";
ИмяКонтекста="job=hirac-srv-app-01";
ИмяКонтура="instance=ones-servers";
ЗначениеМетрики=ПолучитьТекущееКоличествоЛицензииЧерезHIRAC();
КоллекцияМетокМетрики = Новый Структура(
"russian-metric-name","Количество использованных клиентских лицензий 1С"
);


АдаптерМетрикМенеджер.ОпубликоватьМетрику(
   ИмяМетрикиАнгл , ИмяКонтекста,ИмяКонтура, КоллекцияМетокМетрики, ЗначениеМетрики
);

Ошибки в Prometheus, кодировки, службы

Привет
группа ошибок
расскатал hirac на англоязычной версии Win,

  1. в респонсах на запросы прилетает вместо русских имён юзеров - '??????'
  2. на видне служба либо не ставится, либо ещё чего. исправил файл для создания службы, ОС кричит при старте, что служба вовремя не ответила с кодом 1053
  3. если вручную запустить - в prometheus валятся ошибки
    "expected label name, got "INVALID""

конфа прометея

 - job_name: 'stat_1c'
    scrape_interval: 60s
    scrape_timeout: 20s
    params:
      format: ['prometheus']
      dim: ['_all']

    static_configs:
      - targets: ['10.0.12.110:5005']
    metrics_path: '/counter/session'

hirac с develop ветки, ибо с обычной других куча ошибок

Не отображается русский язык

Проблема с отображением русского языка.
Режим запуска: в контейнере, на Ubuntu.

Пример ответа в браузере:
"name": "╨Ы╨╛╨║╨░╨╗╤М╨╜╤Л╨╣ ╨║╨╗╨░╤Б╤В╨╡╤А", "lifetime-limit": 0, "max-memory-size": 0, "security-level": 0, "session-fault-tolerance-level": 0,

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.