prometheus / prometheus/alertmanager

Panic error on config parsing when `update_message: true` in `slack_configs`

Open
#5,164 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Go
Stars
8.6k
Forks
2.5k
Avg merge
2d 6h
Merged PRs (30d)
61

Description

What did you do?

Hi team,
I'm trying to enable https://github.com/prometheus/alertmanager/pull/5007, but Alertmanager fails to parse config file whenever I specify update_message: true (see broken config and logs in attachement).

When update_message: false or I set api_url for each notifier, Alertmanager is able to parse the config.

# amconfig_good.yaml
global:
  slack_api_url: "https://slack.com/api/chat.postMessage"
route:
  receiver: foo
receivers:
  - name: foo
    slack_configs:
      - channel: bar-channel
        send_resolved: true
        update_message: true
        api_url: "https://slack.com/api/chat.postMessage"
      - channel: bar-channel
        send_resolved: true
        update_message: false
$ amtool check-config amconfig_good.yaml
Checking 'amconfig_good.yaml'  SUCCESS
Found:
 - global config
 - route
 - 0 inhibit rules
 - 1 receivers
 - 0 templates
What did you expect to see?

Validation should respect global.slack_api_url config or throw error in human-readable format

What did you see instead? Under which circumstances?

Fatal error during config unmarshaling

System information

Darwin 25.4.0 arm64

Alertmanager version
version: 0.32.0
branch: main
revision: bf98d8214337743a22f2eb7b35980f15ba745829

`amtool` doesn't report version correctly when installed with `go install github.com/prometheus/alertmanager/cmd/amtool@v0.32.0`

$ amtool --version
amtool, version  (branch: , revision: unknown)
  build user:
  build date:
  go version:       go1.26.2
  platform:         darwin/arm64
  tags:             unknown
Alertmanager configuration file
# amconfig_bad.yaml
global:
  slack_api_url: "https://slack.com/api/chat.postMessage"
route:
  receiver: foo
receivers:
  - name: foo
    slack_configs:
      - channel: bar-channel
        send_resolved: true
        update_message: true
Prometheus version
Not relevant
Prometheus configuration file
Not relevant
Logs
$ amtool check-config amconfig_bad.yaml
Checking 'amconfig.yaml'panic: runtime error: invalid memory address or nil pointer dereference [recovered, repanicked]
[signal SIGSEGV: segmentation violation code=0x2 addr=0x0 pc=0x104cb7018]

goroutine 1 [running]:
gopkg.in/yaml%2ev2.handleErr(0x10242137f9d8)
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/yaml.go:249 +0x6c
panic({0x1055e1780?, 0x1057e39c0?})
	/opt/homebrew/Cellar/go/1.26.2/libexec/src/runtime/panic.go:860 +0x12c
gopkg.in/yaml%2ev2.handleErr(0x10242137ecd0)
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/yaml.go:249 +0x6c
panic({0x1055e1780?, 0x1057e39c0?})
	/opt/homebrew/Cellar/go/1.26.2/libexec/src/runtime/panic.go:860 +0x12c
gopkg.in/yaml%2ev2.handleErr(0x10242137e5b0)
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/yaml.go:249 +0x6c
panic({0x1055e1780?, 0x1057e39c0?})
	/opt/homebrew/Cellar/go/1.26.2/libexec/src/runtime/panic.go:860 +0x12c
github.com/prometheus/alertmanager/config.(*SlackConfig).UnmarshalYAML(0x102421452380, 0x107d94a70?)
	/Users/hzieba/go/pkg/mod/github.com/prometheus/alertmanager@v0.32.0/config/notifiers.go:585 +0x188
gopkg.in/yaml%2ev2.(*decoder).callUnmarshaler(0x102421136de0, 0x10242142a7e0, {0x107d94a70, 0x102421452380})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:270 +0x90
gopkg.in/yaml%2ev2.(*decoder).prepare(0x102421136de0, 0x10242142a7e0, {0x1055e8640?, 0x1024210e2738?, 0x10242137e058?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:313 +0x25c
gopkg.in/yaml%2ev2.(*decoder).unmarshal(0x102421136de0, 0x10242142a7e0, {0x1055e8640?, 0x1024210e2738?, 0x1024210f2d80?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:364 +0x180
gopkg.in/yaml%2ev2.(*decoder).sequence(0x102421136de0, 0x10242142a770, {0x10556b760?, 0x102421452230?, 0x10242137e198?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:609 +0x2a0
gopkg.in/yaml%2ev2.(*decoder).unmarshal(0x102421136de0, 0x10242142a770, {0x10556b760?, 0x102421452230?, 0x19?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:374 +0x1d8
gopkg.in/yaml%2ev2.(*decoder).mappingStruct(0x102421136de0, 0x10242142a5b0, {0x105708960?, 0x1024214521c0?, 0x105554b00?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:767 +0x9e4
gopkg.in/yaml%2ev2.(*decoder).mapping(0x102421136de0?, 0x10242142a5b0?, {0x105708960?, 0x1024214521c0?, 0x10242137e548?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:626 +0x384
gopkg.in/yaml%2ev2.(*decoder).unmarshal(0x102421136de0, 0x10242142a5b0, {0x105554b00?, 0x1024214521c0?, 0x10?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:372 +0x1f4
gopkg.in/yaml%2ev2.(*decoder).callUnmarshaler.func1({0x105554b00?, 0x1024214521c0?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:272 +0xc4
github.com/prometheus/alertmanager/config.(*Receiver).UnmarshalYAML(0x1024214521c0, 0x107d94a50?)
	/Users/hzieba/go/pkg/mod/github.com/prometheus/alertmanager@v0.32.0/config/config.go:952 +0x34
gopkg.in/yaml%2ev2.(*decoder).callUnmarshaler(0x102421136de0, 0x10242142a5b0, {0x107d94a50, 0x1024214521c0})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:270 +0x90
gopkg.in/yaml%2ev2.(*decoder).prepare(0x102421136de0, 0x10242142a5b0, {0x1057084e0?, 0x1024214521c0?, 0x10242137e778?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:313 +0x25c
gopkg.in/yaml%2ev2.(*decoder).unmarshal(0x102421136de0, 0x10242142a5b0, {0x1057084e0?, 0x1024214521c0?, 0x1024210f2d50?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:364 +0x180
gopkg.in/yaml%2ev2.(*decoder).sequence(0x102421136de0, 0x10242142a540, {0x10556bc20?, 0x1024214371f8?, 0x10242137e8b8?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:609 +0x2a0
gopkg.in/yaml%2ev2.(*decoder).unmarshal(0x102421136de0, 0x10242142a540, {0x10556bc20?, 0x1024214371f8?, 0x10566ab60?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:374 +0x1d8
gopkg.in/yaml%2ev2.(*decoder).mappingStruct(0x102421136de0, 0x10242142a0e0, {0x1056de4c0?, 0x1024214371d0?, 0x105554a40?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:767 +0x9e4
gopkg.in/yaml%2ev2.(*decoder).mapping(0x102421136de0?, 0x10242142a0e0?, {0x1056de4c0?, 0x1024214371d0?, 0x10242137ec68?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:626 +0x384
gopkg.in/yaml%2ev2.(*decoder).unmarshal(0x102421136de0, 0x10242142a0e0, {0x105554a40?, 0x1024214371d0?, 0x10242137ecb8?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:372 +0x1f4
gopkg.in/yaml%2ev2.(*decoder).callUnmarshaler.func1({0x105554a40?, 0x1024214371d0?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:272 +0xc4
github.com/prometheus/alertmanager/config.(*Config).UnmarshalYAML(0x1024214371d0, 0x107d949b0?)
	/Users/hzieba/go/pkg/mod/github.com/prometheus/alertmanager@v0.32.0/config/config.go:289 +0x3c
gopkg.in/yaml%2ev2.(*decoder).callUnmarshaler(0x102421136de0, 0x10242142a0e0, {0x107d949b0, 0x1024214371d0})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:270 +0x90
gopkg.in/yaml%2ev2.(*decoder).prepare(0x102421136de0, 0x10242142a0e0, {0x1056e2c40?, 0x1024214371d0?, 0x10555a500?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:313 +0x25c
gopkg.in/yaml%2ev2.(*decoder).unmarshal(0x102421136de0, 0x10242142a0e0, {0x1056e2c40?, 0x1024214371d0?, 0x10242137f978?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:364 +0x180
gopkg.in/yaml%2ev2.(*decoder).document(...)
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:384
gopkg.in/yaml%2ev2.(*decoder).unmarshal(0x102421136de0, 0x10242142a070, {0x1056e2c40?, 0x1024214371d0?, 0x10242137f9f8?})
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/decode.go:360 +0x15c
gopkg.in/yaml%2ev2.unmarshal({0x1024214400e0, 0xdb, 0xe0}, {0x1055e83c0, 0x1024214371d0}, 0x1)
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/yaml.go:148 +0x2ec
gopkg.in/yaml%2ev2.UnmarshalStrict(...)
	/Users/hzieba/go/pkg/mod/gopkg.in/yaml.v2@v2.4.0/yaml.go:89
github.com/prometheus/alertmanager/config.Load({0x102421440000, 0xdb})
	/Users/hzieba/go/pkg/mod/github.com/prometheus/alertmanager@v0.32.0/config/config.go:120 +0x54
github.com/prometheus/alertmanager/config.LoadFile({0x16b7cb08c, 0xd})
	/Users/hzieba/go/pkg/mod/github.com/prometheus/alertmanager@v0.32.0/config/config.go:146 +0x3c
github.com/prometheus/alertmanager/cli.CheckConfig({0x102421438290?, 0x10242137fb48?, 0x10242137fc68?})
	/Users/hzieba/go/pkg/mod/github.com/prometheus/alertmanager@v0.32.0/cli/check_config.go:67 +0x188
github.com/prometheus/alertmanager/cli.(*checkConfigCmd).checkConfig(...)
	/Users/hzieba/go/pkg/mod/github.com/prometheus/alertmanager@v0.32.0/cli/check_config.go:48
github.com/alecthomas/kingpin/v2.(*actionMixin).applyActions(...)
	/Users/hzieba/go/pkg/mod/github.com/alecthomas/kingpin/v2@v2.4.0/actions.go:28
github.com/alecthomas/kingpin/v2.(*Application).applyActions(0x102421428100?, 0x1024211a8750)
	/Users/hzieba/go/pkg/mod/github.com/alecthomas/kingpin/v2@v2.4.0/app.go:568 +0xe4
github.com/alecthomas/kingpin/v2.(*Application).execute(0x102421428100, 0x1024211a8750, {0x102421438260, 0x1, 0x1})
	/Users/hzieba/go/pkg/mod/github.com/alecthomas/kingpin/v2@v2.4.0/app.go:398 +0x50
github.com/alecthomas/kingpin/v2.(*Application).Parse(0x102421428100, {0x1024212b0280?, 0x1024212b0280?, 0x102421419260?})
	/Users/hzieba/go/pkg/mod/github.com/alecthomas/kingpin/v2@v2.4.0/app.go:230 +0xe8
github.com/prometheus/alertmanager/cli.Execute()
	/Users/hzieba/go/pkg/mod/github.com/prometheus/alertmanager@v0.32.0/cli/root.go:184 +0xff8
main.main()
	/Users/hzieba/go/pkg/mod/github.com/prometheus/alertmanager@v0.32.0/cmd/amtool/main.go:19 +0x1c

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Reproduce the failure with amtool check-config using the amconfig_bad.yaml example, then trace SlackConfig.UnmarshalYAML in config/notifiers.go and the loading path through config/config.go and cli/check_config.go. Done means the same configuration no longer panics and validation either honors global.slack_api_url or reports a human-readable error.

Written by the indexing model from the issue text.

Assessment

Tech stack
go
Domain
backend, cli
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Clearly specified
Newbie friendliness
72/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.