Руководство по системному администрированию#
В руководстве приведены инструкции по администрированию компонента Сервис управления конвейером DevOps (DPM/PipeWork) (DPMS) (далее по тексту документа — "компонент") продукта Platform V DevOps Pipeline Management (DPM).
Сценарии администрирования#
Администрирование компонента предполагает выполнение сценариев:
Перезапуска.
Изменения параметров настройки компонента (например, смена адреса SMTP-сервера).
Контроля наличия и темпа расходования аппаратных ресурсов, а также их выделения по мере необходимости.
Просмотра журналов действий пользователя или логов Jenkins job.
Перезапуск#
Для выполнения перезапуска требуется:
для перезапуска основных сервисов компонента (dpm-core и/или qgm-core) или иного отдельного конкретного сервиса — следует перезапустить соответствующий сервис;
для полного перезапуска всех сервисов компонента — перезапустить все сервисы компонента в последовательности, идентичной установке — см. раздел "Установка" Руководства по установке.
Перезапуск сервиса осуществляется в панели администрирования WildFly:
Откройте браузер и перейдите по адресу http://{wf-host}:9990/console
Перейдите во вкладку Deployments.
Выберите перезапускаемый сервис.
Нажмите Disable.
Нажмите Enable.
Изменение параметров настройки#
Для изменения параметров настройки требуется:
Открыть файл, указать новые значения соответствующих требуемых параметров, сохранить файл:
Для настройки DPM — в файл standalone_dpm.xml, согласно разделу "Порядок установки DPM" Руководства по установке;
Для настройки QGM — в файл standalone_qgm.xml, согласно разделу "Порядок установки QGM" Руководства по установке.
Перезапустить DPM и/или QGM — посредством перезапуска сервисов dpm-core и/или qgm-core, см. выше сценарий "Перезапуск".
Управление аппаратными ресурсами#
Контроль доступности и темпа расходования аппаратных ресурсов (прежде всего, свободного пространства в разделах для хранения БД, загрузки ЦП и памяти) осуществлять:
посредством анализа метрик мониторинга, выдаваемых актуаторами (в т.ч. текущие размеры выделенного и свободного дискового пространства) — см. ниже раздел "События мониторинга";
посредством установки программных средств автоматического мониторинга, с настройкой автоматических уведомлений по факту снижения размера свободного дискового пространства в разделах для хранения БД ниже минимального резервного уровня;
посредством ручного контроля — не реже 1 раза в сутки, или чаще в течение 10 дней непосредственно после установки и начала эксплуатации компонента и в случаях значительного изменения нагрузки.
Минимальный размер (резерв) свободного дискового пространства в разделах для хранения БД рекомендуется поддерживать согласно нормативным документам эксплуатирующей организации, а при отсутствии таковых — не меньшим, чем обеспечивающим расход в течение 15 дней в темпе, максимальном за последний год эксплуатации компонента.
Просмотр журналов#
Просмотр системного журнала ОС выполняется согласно руководству по администрированию используемой ОС, средствами ОС или с использованием иных средств или систем агрегации и(или) просмотра системных журналов, допустимых согласно регламентирующим документам организации, эксплуатирующей компонент.
Для просмотра журналов, ведущихся компонентом (журнала действий пользователя, журнала логов Jenkins job) требуется выполнить действия, перечисленные в настоящем Руководстве в соответствующем подразделе раздела "События системного журнала" и "События мониторинга".
Просмотр метрик мониторинга#
Просмотр метрик мониторинга может осуществляться:
просмотр текущих значений и истории показателей — с использованием предварительно установленных и настроенных внешних средств или систем сбора и отображения информации мониторинга (например, Prometheus), допустимых согласно регламентирующим документам организации, эксплуатирующей компонент — согласно руководствам по установке и использованию таких средств или систем;
просмотр текущих значений метрик мониторинга:
метрик, отражающих состояние ОС, БД и доступность аппаратных ресурсов — средствами применяемых ОС и БД;
метрик, относящихся к работе компонента как сервиса Java — посредством непосредственного обращения к актуаторам — см. ниже раздел "События мониторинга".
События системного журнала#
На системном уровне компонент обеспечивает протоколирование ошибок, предупреждений и информационных сообщений — см. ниже раздел "События системного журнала ОС".
На прикладном уровне компонент обеспечивает протоколирование логов выполнения Jenkins job из DPM — см. ниже раздел "Просмотр логов выполненной Jenkins job из DPM".
События системного журнала ОС#
Компонент обеспечивает протоколирование в системном журнале ОС информации о работе компонента и обнаруженных ошибках.
В случае ошибок (исключительных ситуаций, Exception) в системном журнале протоколируется имя типа Exception, краткое текстовое описание ошибки, а также трассировка стека (стек вызовов методов на момент обнаружения ошибки).
Детализация протоколирования (только ошибки или предупреждения и информационные сообщения) зависит от текущих настроек уровня протоколирования:
ERROR — протоколирование только ошибок;
WARN — протоколирование ошибок и предупреждений;
INFO — протоколирование ошибок, предупреждений и дополнительной информации;
DEBUG — протоколирование ошибок, предупреждений, дополнительной и отладочной информации.
Настройка уровня протоколирования выполняется в разделе системных настроек (system properties) панели администрирования WildFly http://{wf-host}:9990/console/index.html#system-properties параметром уровень протоколирования (logging level).
Настройки протоколирования сохраняются в файлах logback.spring и log4j2.xml.
События системного журнала ОС регистрируются в файлах:
/var/log/syslog — события запуска процессов
/usr/{WF-directory}/WF_DPM/standalone/log — события приложения
accesslog — события доступа в WildFly, включая входы в панель администрирования
$JBOSS_HOME/standalone/log/server.log или $JBOSS_HOME/standalone/log/{имя_сервиса}/server.log — все не перехваченные события (место хранения по умолчанию)
папка QGS
/var/log/messages — прочие сообщения
Перечень событий, регистрируемых в системном журнале#
Применяемые сокращения:
AS — проект;
FSS — приложение;
RAO — сервис;
RC — релиз-кандидат (РК).
Нижеперечисленные события протоколируются в файлах server.log.
Сообщение |
Уровень протоколирования |
Примечание |
|---|---|---|
%s Cannot find jenkins! |
ERROR |
Здесь и далее "%s" — место вывода конкретизирующей информации в типовом сообщении (для вывода имени объекта, в отношении которого зафиксирована ошибка и т.п.) |
%s cannot get lead for this job! |
ERROR |
|
%s is not valid jira issue key! |
ERROR |
|
${getEntityTypeName()} with ID: $id NOT_FOUND! |
ERROR |
|
Ad hoc release candidate with id=%d should contain only one step |
ERROR |
|
An error has happened. Please contact the administrator. |
ERROR |
|
Bundle phase does not contains Jenkins config |
ERROR |
|
Bundle phase does not contains QGM config |
ERROR |
|
Can't find jira settings! |
ERROR |
|
Can't find step template id |
ERROR |
|
Can't find valid rc with original version = %s and raoKey = %s! |
ERROR |
|
Can't get Class when finding context by id and type. id=%s, type=%s, class=%s |
ERROR |
|
Can't parse permission '$permission' |
ERROR |
|
Can't update unknown varsNo such execute point for QG |
ERROR |
|
Can't update vars |
ERROR |
|
Can't write configured pipeline to file. |
ERROR |
|
Cannot convert config to Jenkins config! |
ERROR |
|
Cannot convert config to QGM config! |
ERROR |
|
Cannot convert config to ReadyForBundle config! |
ERROR |
|
Cannot create new domain in mapper! |
ERROR |
|
Cannot find fss lead for broken user task! |
ERROR |
|
Cannot find job with id = %s |
ERROR |
|
Cannot find login with id %s for current user! |
ERROR |
|
Cannot find M36 Configuration! |
ERROR |
|
Cannot find pipeline with id = %s |
ERROR |
|
Cannot find qgj by id |
ERROR |
|
Cannot get RAO for RC |
ERROR |
|
Cannot restart job |
ERROR |
|
Cannot restart quality gate in state %s with id = %s! |
ERROR |
|
Cannot run generate bundle jobs for non-bundle pipeline owner |
ERROR |
|
Cannot run generate bundle jobs for non-bundle pipeline ownerDpmException |
ERROR |
|
Cannot save pipeline with optional QG! |
ERROR |
|
Cannot update subject var with null value for id = %s |
ERROR |
|
CapacityService Error: Release Activity Object is null |
ERROR |
|
Chain job can contains only Bundle Config |
ERROR |
|
Config not found |
ERROR |
|
Configure Pipeline with id %s not AVAILABLE! |
ERROR |
|
ConfiguredPipeline in status ARCHIVED |
ERROR |
|
Current user can not be lead |
ERROR |
|
Current user can not run this task! |
ERROR |
|
Current user is not equal to transmitted user. |
ERROR |
|
DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [unique_key_constraint] |
ERROR |
|
Days of week should be set |
ERROR |
|
Distributive url: '$distributiveUrl' doesn't match to pattern! |
ERROR |
|
Don't start scheduling task because millisecond date is past |
ERROR |
|
Dpm job has one more scheduled task! |
ERROR |
|
Dpm state '%s' for job with id = %s not supported! |
ERROR |
|
Dpm taskStatus '%s' for job with id = %s not supported! |
ERROR |
|
DpmFpdRcPhaseJob can not be a child of ChainDpmRcJob! |
ERROR |
|
DpmManualRcPhaseJob with id = %s not found! |
ERROR |
|
DpmPhaseQualityGateC can not be a child of ChainDpmRcJob! |
ERROR |
|
Error during create new DpmRaoStep, because StepTemplate with id = %d not found! |
ERROR |
|
Error during get RC's because for rao with id = %s because nexus = null! |
ERROR |
|
Error during init new task, start date = null! |
ERROR |
|
Error during start scheduling task! |
ERROR |
|
Error with define Nexus QG flag |
ERROR |
|
Execution canceled because timeout of 60000 millis was reached |
ERROR |
|
ExternalAppCredentials doesn't exist |
ERROR |
|
Fss lead cannot be null |
ERROR |
|
Fss not found for job |
ERROR |
|
FssStepResponsibleUser with id %s has not found! |
ERROR |
|
Groovy DSL pipeline 'input' operation is not supported by DPM |
ERROR |
|
Incorrect login or token for Nexus! |
ERROR |
|
Invalid username/password supplied |
ERROR |
|
Jira Issue with id=%s |
ERROR |
|
Job configuration not found! |
ERROR |
|
Job with id = {} not is chainable job! |
ERROR |
|
Job with id = %s isn't from step with id = %s |
ERROR |
|
Key %s already exist |
ERROR |
|
Key: %s is not valid!", entity.getKey() |
ERROR |
|
Lead can not be null |
ERROR |
|
Login should not be empty! |
ERROR |
|
M36 job does not contains %s |
ERROR |
|
Nexus check response for RC is null |
ERROR |
|
Nexus is null for raoId= |
ERROR |
|
No actual config found in QGMRcPhaseJob! |
ERROR |
|
No any valid tech windows for project entity: |
ERROR |
|
No fss with name " + stStepResponsibleUserDTO.getFssName() + " found |
ERROR |
|
No release note found for artifact with key: ${artifact.key} |
ERROR |
|
No required key found in SAST check result |
ERROR |
|
No user was found. |
ERROR |
|
Not enough permissions for operation |
ERROR |
|
Not found chatOwner with type=%s and id=%s |
ERROR |
|
Not found correct state for tech window with id = |
ERROR |
|
Not found rao profile for release candidate with id = |
ERROR |
|
Not found scope run |
ERROR |
|
Not implemented yet! |
ERROR |
|
Not supported fss step responsible type value: %s. |
ERROR |
|
Not supported job type |
ERROR |
|
Not valid parsing for version: %s, size parse %s |
ERROR |
|
Only token owner can delete this token |
ERROR |
|
Phase job of type %s is not service job! |
ERROR |
|
Phase job type: %s is not supported |
ERROR |
|
Phase not found |
ERROR |
|
PhaseJobType is not QGMRcPhaseJob! |
ERROR |
|
PipelineStep is null |
ERROR |
|
PipelineTemplate must have 'step' and 'pipeline' reference %s |
ERROR |
|
Profile with id = %s already exist. Use update request instead |
ERROR |
|
Project entity with key = %s does not exist |
ERROR |
|
Project entity with key = %s is not found |
ERROR |
|
Project key: '$projectKey' doesn't match to pattern! |
ERROR |
|
Project with key: '${rga.toProjectKey()}' already exists! |
ERROR |
|
QG job with id %s not optional! |
ERROR |
|
Quality gate log with id '$id' not found! |
ERROR |
|
QualityGateJob is not in QG_JOB_WAIT_SUBSCRIPTION state! {} |
ERROR |
|
Queue for %s type does not supported! |
ERROR |
|
Queue size cannot be 0! |
ERROR |
|
RAO has incorrect 'OTHER' Profile! |
ERROR |
|
RAO has incorrect Profile's rank! |
ERROR |
|
RAO Profile with id = %s not found! |
ERROR |
|
RAO with id: %s has %s configured pipeline |
ERROR |
|
Rao with key " + raoKey + " not found! |
ERROR |
|
RAO with key %s is not found |
ERROR |
|
RC with id: %s has actual phaseJob |
ERROR |
|
ReadyForBundleRcPhaseJob can not be a child of ChainDpmRcJob! |
ERROR |
|
Regexp should not be empty or null |
ERROR |
|
Release Activity Object is not in ACTIVE state! |
ERROR |
|
Release Candidate can not be continued because it is archived |
ERROR |
|
Release note not found for url: ${request.url} |
ERROR |
|
Release notes already exists for this distributive! |
ERROR |
|
Repository for %s not found! |
ERROR |
|
Repository url: '$repositoryUrl' doesn't match to pattern! |
ERROR |
|
Required parameters are not filled: %s |
ERROR |
|
Role automation settings are incomplete! Contact the administrator! |
ERROR |
|
Role with id = '" + roleId + "' not found |
ERROR |
|
Sorry, we used incorrect status for tech window with id = |
ERROR |
|
Start date should not be after end date |
ERROR |
|
Start time should not be after end time |
ERROR |
|
Status '$status' not found for QG '${qg.name}', allowed statuses: [${qg.statuses.joinToString()}] |
ERROR |
|
StepTemplate with id " + stepTemplateId + " not found! |
ERROR |
|
Target entity with id = " + target.getId() + " is not a child of entity with id = " + origin.getId() |
ERROR |
|
Task does not created, because there is an active task for this RAO with key= |
ERROR |
|
Task hasn't added to queue |
ERROR |
|
Task is not in ACTIVE or WAIT_FOR_ANSWER state! |
ERROR |
|
Task is not in ACTIVE state! |
ERROR |
|
Task not found! |
ERROR |
|
Task status did not changed! |
ERROR |
|
Task type: %s is not supported |
ERROR |
|
TechWindow not found or deleted |
ERROR |
|
The EventProcessor's childrens: %s did not configured to work with any entity |
ERROR |
|
The JobConfigBuilder's children count: %s don't equal to count: %s of JobConfigBuilder's services |
ERROR |
|
There are no instances of SALM |
ERROR |
|
There can not be more than one user for this role |
ERROR |
|
There is no any conditions! |
ERROR |
|
This method allows for DPM targeted roles |
ERROR |
|
This parameter name '%s' is reserved, use another one please. |
ERROR |
|
This pipeline contains step without main scope phases! |
ERROR |
|
This pipeline is running on previous stageOrder! |
ERROR |
|
Timetable not found or deleted |
ERROR |
|
Timetable with id=" + newTimetable.getId() + " not available for select |
ERROR |
|
Token should not be empty! |
ERROR |
|
Token with id '" + tokenId + "' not exist |
ERROR |
|
Try to sync not ACTIVE job |
ERROR |
|
Unknown basicApp for rcStep |
ERROR |
|
Unknown complexReleaseSortType |
ERROR |
|
Unknown ConfiguredPipeline type: |
ERROR |
|
Unknown entity Id = %s |
ERROR |
|
Unknown entity key |
ERROR |
|
Unknown fss for rcStep |
ERROR |
|
Unknown job type: %s! |
ERROR |
|
Unknown pipeline owner type %s! |
ERROR |
|
Unknown pipeline type: |
ERROR |
|
Unknown project entity type! |
ERROR |
|
Unknown QGM user. Probably can't get info via authentication provider. |
ERROR |
|
Unknown SAST quality gate type: |
ERROR |
|
Unknown step name |
ERROR |
|
Unknown target type! |
ERROR |
|
Unknown targeted role type! |
ERROR |
|
Unknown targeted validation mode! |
ERROR |
|
Unknown type: |
ERROR |
|
Unrecognized ldap name $domain |
ERROR |
|
Unsupportable phase type |
ERROR |
|
Unsupportable pipeline variable project entity |
ERROR |
|
User details not mapped |
ERROR |
|
User is blocked in QGM |
ERROR |
|
User permission with id '$id' not found |
ERROR |
|
You can't restart step because Release Candidate is interrupted! |
ERROR |
|
You have not enough permission for this |
ERROR |
События мониторинга#
Встроенные средства мониторинга#
Компонент содержит следующие собственные встроенные средства мониторинга.
В составе DPM и QGM реализованы актуаторы, обеспечивающие выдачу (по запросу от внешней системы, например Prometheus) информации о состоянии сервисов.
Актуаторы обеспечивают выдачу следующей информации при обращении по соответствующим URL (ниже <адрес сервиса> = DNS-имя или IP-адрес сервиса), на примере QGM:
перечень типов выдаваемой информации и URL соответствующих актуаторов — http://<DNS-имя или IP-адрес>:8080/qgm/actuator
текущая версия компонента — http://<DNS-имя или IP-адрес>:8080/qgm/actuator/info
состояние компонента — http://<DNS-имя или IP-адрес>:8080/qgm/actuator/health
В перечне типов выдаваемой информации возвращаются:
тип информации
URL для запроса соответствующей информации
Пример ответа актуатора с перечнем типов выдаваемой информации (на примере QGM):
{
"_links": {
"self": {
"href": "http://<DNS-имя или IP-адрес>:8080/qgm/actuator",
"templated": false
},
"health": {
"href": "http://<DNS-имя или IP-адрес>:8080/qgm/actuator/health",
"templated": false
},
"health-path": {
"href": "http://<DNS-имя или IP-адрес>:8080/qgm/actuator/health/{*path}",
"templated": true
},
"info": {
"href": "http://<DNS-имя или IP-адрес>:8080/qgm/actuator/info",
"templated": false
}
}
}
Пример ответа актуатора с информацией о текущей версии компонента (на примере QGM):
{
"version":"<номер версии и дата и время сборки (*)>",
"artifactId":"qgm"
}
(*) дата и время сборки возвращаются целым числом (время эпохи Unix = число миллисекунд с 1970-01-01 00:00:00+00)
В информации о состоянии компонента возвращаются значения метрик мониторинга:
Метрика |
Пояснение |
|---|---|
components.db.status |
текущий статус сервера БД |
components.discoveryComposite.status |
текущий статус Сервиса обеспечения взаимодействия сервисов |
components.discoveryComposite.components.discoveryClient.details.services |
перечень зарегистрированных сервисов |
components.discoveryComposite.components.eureka.details.applications |
количество экземпляров зарегистрированных сервисов |
components.diskSpace.status |
текущий статус наличия свободного дискового пространства |
components.diskSpace.details.total |
текущий размер выделенного дискового пространства |
components.diskSpace.details.free |
текущий размер свободного дискового пространства |
components.diskSpace.details.threshold |
пороговое минимальное значение размера свободного дискового пространства |
components.ping.status |
текущий статус ping |
Пример ответа актуатора с информацией о состоянии компонента (на примере QGM):
{
"status": "UP",
"components": {
"db": {
"status": "UP",
"details": {
"database": "PostgreSQL",
"validationQuery": "isValid()"
}
},
"discoveryComposite": {
"status": "UP",
"components": {
"discoveryClient": {
"status": "UP",
"details": {
"services": [
"qg-applicability-service",
"dpm-mail",
"dpm-core",
"dpm-processing",
"dpm-eureka",
"dpm-auth",
"qg-elk-service",
"dpm-artifact-sync",
"dpm-jenkins-log",
"dpm-atlassian-integration",
"dpm-relay",
"qg-core",
"qg-eureka",
"qg-validation-service"
]
}
},
"eureka": {
"description": "Remote status from Eureka server",
"status": "UP",
"details": {
"applications": {
"QG-APPLICABILITY-SERVICE": 1,
"DPM-MAIL": 1,
"DPM-CORE": 1,
"QG-CORE": 1,
"QG-VALIDATION-SERVICE": 1,
"DPM-PROCESSING": 1,
"DPM-EUREKA": 1,
"DPM-AUTH": 1,
"QG-ELK-SERVICE": 1,
"QG-EUREKA": 1,
"DPM-ARTIFACT-SYNC": 1,
"DPM-JENKINS-LOG": 1,
"DPM-ATLASSIAN-INTEGRATION": 1,
"DPM-RELAY": 1
}
}
}
}
},
"diskSpace": {
"status": "UP",
"details": {
"total": <возвращенное значение>,
"free": <возвращенное значение>,
"threshold": <возвращенное значение>,
"exists": true
}
},
"hystrix": {
"status": "UP"
},
"ping": {
"status": "UP"
},
"refreshScope": {
"status": "UP"
}
}
}
Дополнительные средства мониторинга#
Поскольку основными составляющими компонента являются Java сервисы и БД — для мониторинга работы программно-аппаратных средств могут применяться типовые решения мониторинга работы оборудования, Java сервисов и БД, допустимые согласно регламентирующим документам организации, эксплуатирующей компонент.
Часто встречающиеся проблемы и пути их устранения#
Типовые проблемы не выявлены.
В случае общих ошибок (проявляющихся для пользователей в виде сообщений об ошибках или ошибках с кодом 500, преимущественно при попытке выполнения операций, предполагающих запись или изменение информации в БД, в частности, создания объектов или изменения свойств объектов) следует проверить:
Наличие свободного пространства в разделах для хранения БД — см. выше подраздел "Управление аппаратными ресурсами" раздела "Сценарии администрирования". В случае отсутствия свободного дискового пространства следует:
обеспечить наличие свободного дискового пространства в разделах для хранения БД — согласно руководству по администрированию используемых ОС и БД;
перезагрузить компонент согласно разделу "Перезапуск" настоящего руководства.