Configuration File¶
IMPulse uses a single configuration file called
impulse.yml. You can customize its location using the CONFIG_PATH environment variable.The configuration can be reloaded while IMPulse is running without requiring a restart.
Required fields
Fields marked with "*" are mandatory within their parent section, but only if that parent section is present in the configuration.
Below are all the configuration options supported by IMPulse.
incident¶
- description: incidents behavior options
- type: dict
incident.notifications¶
- description: incident notifications settings
- type: dict
incident.notifications.assignment¶
- description: enable/disable notifications about incident assignment changes
- type: bool
- default value: True
incident.notifications.new_firing¶
- description: notification about new firing instances
- type: bool
- default value: True
incident.notifications.partial_resolved¶
- description: nofitication about some resolved instances
- type: bool
- default value: False
incident.timeouts¶
- description: incident status timeouts (see lifecycle)
- type: dict
incident.timeouts.firing¶
- description: after this time, incident status changes from 'firing' to 'unknown' if no alerts appear
- type: string
- default value: 6h
- allowed values: same time format as
waitin messenger chains
incident.timeouts.unknown¶
- description: after this time, incident status changes from 'unknown' to 'closed' if no alerts appear
- type: string
- default value: 6h
- allowed values: same time format as
waitin messenger chains
incident.timeouts.resolved¶
- description: after this time, incident status changes from 'resolved' to 'closed' if no alerts appear
- type: string
- default value: 12h
- allowed values: same time format as
waitin messenger chains
incident.timeouts.closed¶
- description: after this time, 'closed' incident will be deleted
- type: string
- default value: 90d
- allowed values: same time format as
waitin messenger chains
messenger *¶
- description: messenger configuration
- type: dict
messenger.address * (Mattermost)¶
- description: your messenger server address
- type: string
messenger.admin_users *¶
- description: IMPulse administrators (from
messenger.users) notified of any warnings - type: list
messenger.channels *¶
- description: define channels by their ID to use them in the route section. Use your messenger's UI to find the channel IDs.
- type: dict
Example
messenger: channels: incidents_default: {id: C09NSUL269T}messenger: channels: incidents_default: {id: w8gvebq58fgo9civ8begs6renw}messenger: channels: incidents_default: {id: -1003748296152}
messenger.chains¶
- description: escallation chains
- type: dict
Chains specify notification sequences for incident escalation. They are referenced in the route section to determine who gets notified and in what order.
Each chain contains a list of steps. There are 5 step types. 3 of them are notifications:
The fourth step type is
wait, which delays the execution of the next notification. Its format is similar to the sleep utility format, but it does not support floats or combined expressions like1m 3s. Valid units:s(seconds),m(minutes),h(hours),d(days).The fifth step type is
chain, which allows you to include nested chains within a parent chain.There are 3 types of chain:
- simple
- schedule
- cloud
<simple chain>¶
- description: a basic escalation chain. It starts executing when an incident is created.
- type: list
Example:
# Defined two simple chains for DevOps team messenger: chains: devops: - user: Dmitry - wait: 5m - user: Dmitry_s_boss devops-critical: - user: Dmitry - wait: 3m - webhook: Dmitry_call - wait: 5m - user: Dmitry_s_boss - wait: 15m - user: CTO
<schedule chain>¶
- description: a chain that allows you to define notification logic based on a calendar schedule.
- type: dict
It is recommended to use
stepswithoutmatcherat the end to handle unmatched datetimes.Examples:
messenger: chains: support: type: schedule timezone: Asia/Tashkent schedule: - matcher: start_day_expr: dow start_day_values: ["Mon", "Tue"] start_time: "09:00" # 24h format duration: 24h steps: - user: Dmitry - matcher: start_day_expr: dow start_day_values: ["Wed", "Thu"] start_time: "09:00" # 24h format duration: 24h steps: - user: Alexander - steps: # will work at Sunday - user: AdministratorYou can also use modulus expressions for
dowanddom:- matcher: start_day_expr: dow % 2 start_day_values: [0] # matches when Tue, Thu, Satmessenger: chains: support: type: schedule timezone: Asia/Tashkent schedule: - {matcher: {start_day_expr: dow, start_day_values: [1, 2], start_time: "12:00", duration: 12h}, steps: [{user: Dmitry}]} - {matcher: {start_day_expr: dow, start_day_values: [3, 4], start_time: "12:00", duration: 12h}, steps: [{user: Alexander}]} - {matcher: {start_day_expr: dow, start_day_values: [5, 6], start_time: "12:00", duration: 12h}, steps: [{user: Maria}]} - {steps: [{user: Oleg }]} # full Sunday and 00:00 to 12:00 every day
messenger.chains[].type *¶
- description: set chain type using
type: schedule - type: string
messenger.chains[].timezone¶
- description: time zone in "TZ identifier" format (details here)
- type: string
- default value: UTC
messenger.chains[].schedule¶
- description: list of matchers with corresponding steps. IMPulse evaluates matchers from top to bottom. If a
matchermatches the current time, the correspondingstepsdefined for thatmatcherare selected. - type: list
Examples:
messenger: chains: support: type: schedule timezone: Asia/Tashkent schedule: - matcher: start_day_expr: dow start_day_values: ["Mon", "Tue"] start_time: "09:00" duration: 24h steps: - user: Dmitry - steps: - user: Administratormatcher
- description: datetime matcher which will be compared with current datetime
- type: dict
Matcher contains theese fields:
start_day_expr *
- description: date matching strategy: "dow" (day of week), "dom" (day of month), "date" (exact date). Expressions like "dow % 2" (least positive remainder) are also allowed.
- type: string
start_day_values *
- description: values for the expression start_day_expr
- type: list
Available values:
- for
dow: 0 to 7 (like in cron) or "Sun", "Mon"...- for
dom: 1 to 31- for
date: "2024-12-24" formatstart_time
- description: local time in "HH:MM" format (24-hour)
- type: string
duration
- description: duration of the active window, e.g., "12h" or "2d"
- type: string
steps
- description: list of chain steps (same as in simple chain). It is recommended to use
stepswithoutmatcherat the end to handle unmatched datetimes.- type: list
<cloud chain>¶
- description: a chain that allows you to define dynamic chains using calendar providers (e.g., Google). Setup instruction here.
- type: dict
Special ENVs (see details):
CHAIN_PROVIDER_DAYS_TO_SYNCCHAIN_PROVIDER_MAX_EVENTSCHAIN_PROVIDER_SYNC_INTERVAL_SECONDSGOOGLE_SERVICE_ACCOUNT_FILE
messenger.chains[].type *¶
- description: chain type
- type: string
- allowed values:
cloudonly
messenger.chains[].provider *¶
- description: cloud calendar provider
- type: string
- allowed values:
googleonly
messenger.chains[].calendar_id *¶
- description: calendar ID. Get it on calendar settings page
- type: string
messenger.chains[].default_steps¶
- description: chain steps if there are no calendar events at the moment
- type: list
To use cloud chains you should generate service account file
key.json(see instructions for google provider) and add service account to your calendar.Create "Event" in calendar. Put chain steps in "Description" using format:
- user: Dmitry - wait: 10m - user: MariaExample
With event in calendar
name: Test event from: 2024-12-24 15:00 (Asia/Tashkent) to: 2024-12-25 15:00 (Asia/Tashkent) description: - user: Valeryand config
messenger: chains: devops: type: cloud provider: google calendar_id: b7ec15a9f4cb22d45819b7d3e96424a03e51987461adbc22385f964cf7103a62@group.calendar.google.com default_steps: - user: Dmitry - wait: 5m - user: MariaUnder the hood, the following
schedule chainwill be generated:messenger: chains: devops: type: schedule timezone: Asia/Tashkent schedule: - {matcher: {start_day_expr: date, start_day_values: ["2024-12-24"], start_time: "15:00", duration: 24h}, steps: [{user: Valery}]} - {steps: [{user: Dmitry}, {wait: 5m}, {user: Maria}]}
<nested chain>¶
- description: allows one chain to include other chains as nested steps
- type: string
Additionally, the
chainstep can be used with all types of chains. This allows one chain to include other nested chains. In some cases, this approach simplifies and reduces the overall configuration. Nesting is supported to any depth.Example
messenger: chains: devops: - user: Dmitry - wait: 5m - user: Dmitry_s_boss programmers: - user: Valery - wait: 5m - chain: devops
messenger.impulse_address * (Mattermost, Telegram)¶
- description: IMPulse address for button callbacks. Telegram supported only HTTPS.
- type: string
messenger.users *¶
- description: users declaration. Defines users used in chains for direct notifications.
- type: dict
See instructions for getting user
idfor Slack (here), Mattermost (here), Telegram (here).Example
messenger: users: Dmitry: {id: U73MD1YLR4M}messenger: users: Dmitry: {id: ic8pft3ac7rjrd9eopxp4kc7qy}messenger: users: Dmitry: {id: 482913726}
messenger.user_groups¶
- description: groups of users for bulk notification. Used in chains.
- type: list
Example
messenger: user_groups: developers: {users: ["Dmitry", "Alexander"]}
messenger.team * (Mattermost)¶
- description: team name
- type: string
messenger.template_files¶
- description: path to custom template files for
status_icons,header, andbody(see Incident Structure) - type: dict
IMPulse uses jinja2 templates to set messages format. And you can modify it.
Incident message contains three parts (picture). Default template files for theese parts is here. You can copy the default templates, modify them, and specify custom paths.
Template files supported special variables:
incident(used here) andpayload.Example
messenger: template_files: status_icons: ./templates/status_icons.yml header: ./templates/header.yml body: ./templates/body.yml
messenger.template_files.body¶
- description: path to the custom template file that defines the format of
body - type: string
- default value: ./templates/<messenger.type>_body.j2
messenger.template_files.header¶
- description: path to the custom template file that defines the format of
header - type: string
- default value: ./templates/<messenger.type>_header.j2
messenger.template_files.status_icons¶
- description: path to the custom template file that defines the format of
status_icons - type: string
- default value: ./templates/<messenger.type>_status_icons.j2
messenger.type *¶
- description: messenger type
- type: string
- allowed values:
slack- Slack messengermattermost- Mattermost messengertelegram- Telegram messengernone- disable messenger integration
route *¶
- description: incident routing rules based on alert fields. See details
- type: dict
Route configure messenger channels, where incidents will be created, and chains to notify people by rules.
It is very similar to Alertmanager's route. But has only four instructions:
routes,matchers,channel,chain.Matchers use Python regular expressions instead of Alertmanager's syntax.
Example:
route: channel: incidents_default # default channel where incidents will be created if their didn't match any matchers chain: devops # optional, but we recommend set it to handle alerts didn't match any matchers routes: # Infrastructure routes - matchers: - service =~ "cpu|disk|memory|network" # regex selector powered by Python regex channel: incidents-infrastructure # channel for not "critical" or "warning" severity # no chain here means users will not be notified, just incident created routes: - matchers: - severity = "critical" # simple selector channel: incidents-infrastructure chain: devops-critical - matchers: - severity = "warning" channel: incidents-infrastructure chain: devops # Services routes - matchers: - service = "fingernote" channel: incidents-services chain: fingernote-team routes: - matchers: - severity = "critical" channel: incidents-services chain: fingernote-team-critical - matchers: - service = "pickcase" channel: incidents-services chain: pickcase-team routes: - matchers: - severity = "critical" channel: incidents-services chain: pickcase-team-critical
route.channel *¶
- description: default channel where incidents will be created if they don't match any matchers
- type: string
route.chain¶
- description: default chain to notify users if alert don't match any matchers inside route.routes
- type: string
route.routes¶
- description: list of routing rules based on matchers to determine which channel and chain to use for incidents
- type: list
route.routes[].matchers¶
- description: conditions to match alert fields using Python regex patterns
- type: list
route.routes[].channel¶
- description: channel where incidents will be created if they match the matchers
- type: string
route.routes[].chain¶
- description: chain to notify users if incidents match the matchers
- type: string
route.routes[].routes¶
- description: nested routing rules for more detailed incident classification (recursive structure)
- type: list
task_management¶
- description: task tracking system integration configuration (e.g., Jira) (see details). The
task_management:block enables Task button. - type: dict
task_management.type *¶
- description: task tracking system type
- type: string
- options:
jira- Jira integration
task_management.project_key *¶
- description: project key in the task tracking system where tasks will be created
- type: string
Example
task_management: type: jira project_key: PROJ
task_management.template_files¶
- description: path to custom template files for task creation
- type: dict
IMPulse uses Jinja templates to format task summary and description. You can customize these templates to match your requirements.
Template files support special variables:
incident.If
template_filesis not specified, IMPulse will use default template filesExample:
# Custom templates for both summary and description task_management: type: jira project_key: PROJ template_files: summary: templates/jira_custom_summary.j2 description: templates/jira_custom_description.j2
task_management.template_files.summary¶
- description: path to the custom template file that defines the format of task summary
- type: string
- default value: ./templates/<task_management.type>_summary.j2
task_management.template_files.description¶
- description: path to the custom template file that defines the format of task description
- type: string
- default value: ./templates/<task_management.type>_description.j2
ui¶
- description: user interface configuration (see details). The
ui:block enables the web interface - type: dict
Example:
ui: columns: - name: status header: Status value: incident.status - name: created type: datetime header: Created value: incident.created - name: alertname header: Alertname type: link url: incident.link value: payload.commonLabels.alertname - name: severity header: Severity value: payload.commonLabels.severity - name: summary header: Summary value: payload.commonAnnotations.summary colors: severity: critical: "#FF0000" warning: "#FFA500" info: "#00FF00" filters: - severity="critical" sorting: - severity: desc order: ["info", "warning", "critical"] - created: desc
ui.colors¶
- description: allows you to color the border of a specific cell in a column based on its value.
- type: dict
Example
ui: colors: severity: # column name critical: "#FF0000" # set red border for column severity="critical" warning: "#FFA500" # set orange border for column severity="warning" info: "#00FFFF" # set cyan border for column severity="info" team: # column name devops: "#00FFFF" # set cyan border for column team="info"
ui.columns *¶
- description: defines the columns that are used in the user interface
- type: list
ui.columns[].name *¶
- description: unique identifier for the column, used for filtering and sorting
- type: string
ui.columns[].header *¶
- description: display name shown in the column header
- type: string
ui.columns[].value *¶
- description: data source variable (e.g.,
incident.status,payload.commonLabels.alertname) - type: string
Supported special variables:
incidentandpayload.
ui.columns[].type¶
- description: column data type that determines how the value is rendered
- type: string
- default value:
string - allowed values:
string- plain textdatetime- date/time values with formatting optionslink- clickable links (requires url field)
ui.columns[].visible¶
- description: whether the column is visible by default in the UI. Invisible columns can be used in search fields.
- type: boolean
- default value: True
ui.columns[].url¶
- description: variable containing the required link (e.g.,
incident.link) (used withtype: link) - type: string
Supported special variables:
envandincident.
ui.columns[].format¶
- description: formatting option for datetime columns (used with
type: datetime) - type: string
- default value: relative
- allowed values:
absolute- full date and timerelative- relative time (e.g., "2h ago")
Example:
ui: columns: - name: status header: Status type: string value: incident.status visible: True - name: created type: datetime header: Created value: incident.created - name: alertname header: Alertname url: incident.link value: payload.commonLabels.alertname - name: severity header: Severity value: payload.commonLabels.severity - name: summary header: Summary value: payload.commonAnnotations.summary
ui.filters¶
- description: defines the default filters applied in the user interface
- type: list
Example
ui: filters: - severity=~"warning|critical"
ui.sorting¶
- description: the default column sorting order
- type: list
Sorting contains a list of column names and their sorting methods. There are three sorting methods: asc, desc, and none:
- asc sorts values in alphabetical order
- desc sorts in reverse alphabetical order
- none disables sorting by default and used to define a custom order
Custom sorting is defined using the
orderfield, which specifies the exact sequence in which rows should appear whenascis selected. If you want to disable sorting by default but use a custom order for some columns, use thenonemethod.Example:
ui: sorting: - created: desc - severity: none order: ["info", "warning", "critical"]
webhooks¶
- description: webhooks provide alternative notification options via HTTP POST requests to custom endpoints
- type: dict
see INTEGRATIONS / External menu for provider examples
webhooks[].auth¶
- description: string for HTTP Basic Auth (e.g., user:password)
- type: string
Supported special variables:
env.
webhooks[].data¶
- description: data to be sent in the POST request body
- limitations: cannot be used together with
webhooks[].json - type: dict
Supported special variables:
envandincident.Example:
webhooks: dmitry_call: url: 'http://internal_system:8080' data: channel_id: '{{ incident["channel_id"] }}' complex_jinja_example: url: http://internal_system:8081/ data: instances: '{{ incident.payload.alerts | map(attribute="labels.instance") | unique | join(", ") }}'
webhooks[].json¶
- description: JSON data to be sent in the POST request body
- limitations: cannot be used together with
webhooks[].data - type: dict or str
Supported special variables:
envandincident.Examples:
# Send alert payload webhooks: send_payload: url: 'http://another_host:5003/' json: '{{ incident["payload"] }}'# Create custom JSON webhooks: generate_json: url: 'http://another_host:5003/' json: channel: id: '{{ incident["channel_id"] }}' status: '{{ incident["status"] }}'
webhooks[].url *¶
- description: URL to which the HTTP POST request will be sent
- type: string
Supported special variables:
env.