That's clearer, so there are two API formats: a "text 
<https://developers.google.com/chat/api/guides/message-formats/text>" 
message and a "card 
<https://developers.google.com/chat/api/guides/message-formats/cards>" 
message.

It looks like Calert is hard-coded to using the "text" format:
https://github.com/mr-karan/calert/blob/main/internal/providers/google_chat/alerts.go#L29-L34
https://github.com/mr-karan/calert/blob/main/internal/providers/google_chat/message.go#L18-L53

Hence you could either extend Calert to work with cards too - or raise it 
as a feature request; or you could implement your own alertmanager webhook 
to Google Chat gateway.

On Wednesday, 14 June 2023 at 08:14:03 UTC+1 Near N wrote:

> Brian, a wildcard is just a gibberish of standard card messages proposed 
> by Google. I believe you're already familiar with 
> https://developers.google.com/chat/api/guides/message-formats/cards#apps-script
>
> Based on Mr-Karan's example (
> https://github.com/mr-karan/calert/blob/main/docs/examples/send_alert.sh) 
> my assumption is as follows:
> 1) Calert retrieves an unstructured json alert, which alertmanager puts to 
> host:6000
> 2) After that calert converts such a raw json to the one suiting it's 
> template
> 3) It is then posting it to a google chat via curl
>
> Hence, calert is capable of processing the message under the hood, 
> converting it to Google API-friendly json format and this is I guess I was 
> looking for, but lack general understanding of whether it is possible to 
> amend
> среда, 14 июня 2023 г. в 12:21:49 UTC+6, Brian Candler: 
>
>> > It is basically possible by converting the message in a wildcard 
>> structure acceptable by Google Chat API
>>
>> I don't know what you mean by a "wildcard structure".  Can you give an 
>> example, and/or point to documentation?  Is it using tags within the 
>> message field, or does it require a different JSON structure entirely?
>>
>> On Wednesday, 14 June 2023 at 05:12:53 UTC+1 Near N wrote:
>>
>>> Correct, that's same calert I was mentioning previously. I understand 
>>> the use case of default template, but thought it is possible to do 
>>> highlighting within the template. It is basically possible by converting 
>>> the message in a wildcard structure acceptable by Google Chat API, but I 
>>> couldn't find any options to do so with calert template, but thanks for 
>>> suggestions
>>>
>>> понедельник, 12 июня 2023 г. в 19:43:10 UTC+6, Brian Candler: 
>>>
>>>> If we're talking about the same "calert 
>>>> <https://github.com/mr-karan/calert>" then it looks like it already 
>>>> supports user-supplied templating of the message content:
>>>>
>>>> https://github.com/mr-karan/calert/blob/main/internal/providers/google_chat/message.go#L18-L53
>>>>
>>>> The sample config shows how to configure it:
>>>> https://github.com/mr-karan/calert/blob/main/config.sample.toml#L13
>>>> https://github.com/mr-karan/calert/blob/main/static/message.tmpl
>>>>
>>>> If you want to do colours and highlighting, it would depend whether the 
>>>> Google Chat API accepts HTML tags, or some other way of marking up the 
>>>> content. You'll need to find that out.
>>>>
>>>> The variables available in the templates look to be very similar to 
>>>> those provided in Alertmanager templates:
>>>> https://prometheus.io/docs/alerting/latest/notifications/
>>>> https://prometheus.io/docs/alerting/latest/notification_examples/
>>>>
>>>> In fact, there's a test case which uses exactly the alertmanager code 
>>>> (an instance of alertmgrtmpl.Alert) to drive it:
>>>>
>>>> https://github.com/mr-karan/calert/blob/main/internal/providers/google_chat/google_chat_test.go#L27-L35
>>>>
>>>> On Monday, 12 June 2023 at 11:33:32 UTC+1 Near N wrote:
>>>>
>>>>> Brian, thanks for pointing to other integrations. The reason why I was 
>>>>> wondering about curling the messages is that the existing solution 
>>>>> (Calert) 
>>>>> provides little information about templating options. Alerts are 
>>>>> incoming, 
>>>>> but with tight information. I'd love to highlight severity in different 
>>>>> colors, add warning icons, e.g. something similar to Zabbix or at least 
>>>>> that can suit basic user-friendly message. 
>>>>>
>>>>> понедельник, 12 июня 2023 г. в 16:06:34 UTC+6, Brian Candler: 
>>>>>
>>>>>> I can't speak for the project, but my guess would be it's out of 
>>>>>> scope. There are many existing integrations which use the existing 
>>>>>> webhook 
>>>>>> mechanism:
>>>>>>
>>>>>> https://prometheus.io/docs/operating/integrations/#alertmanager-webhook-receiver
>>>>>> Doing it externally allows the request to be enriched with other data 
>>>>>> which wouldn't be available in a template, and to use a variety of 
>>>>>> outbound 
>>>>>> authentication mechanisms which Alertmanager itself doesn't implement, 
>>>>>> or 
>>>>>> even non-HTTP protocols like STOMP.
>>>>>>
>>>>>> In any case, text templating is a nasty and insecure way to create 
>>>>>> JSON or XML payloads.
>>>>>>
>>>>>> > it is possible to converse the receivable JSON on the hop and just 
>>>>>> send notifications via curl method
>>>>>>
>>>>>> You'd first have to *receive* the webhook payload from Alertmanager, 
>>>>>> which involves plugging your curl script into a webserver somehow. You 
>>>>>> could probably write one as a CGI script under Apache, for example.
>>>>>>
>>>>>> But why would you do that, when you have an existing tested and 
>>>>>> working solution?
>>>>>>
>>>>>> On Monday, 12 June 2023 at 08:13:50 UTC+1 Near N wrote:
>>>>>>
>>>>>>> Thanks for reply  Brian. I do realize, that Google Chat API requires 
>>>>>>> a particular JSON format, but was assuming Alertmanager is capable of 
>>>>>>> doing 
>>>>>>> it by using particular template, which is wrong. Now the questions is 
>>>>>>> whether it is worth creating a PR to create such a feature or it is out 
>>>>>>> of 
>>>>>>> Alertmanager's standard scope?
>>>>>>>
>>>>>>> Another question is perhaps it is possible to converse the 
>>>>>>> receivable JSON on the hop and just send notifications via curl method? 
>>>>>>> I 
>>>>>>> mean if the endpoint contains the following alert "
>>>>>>> [{"annotations":{"server":"main","number_of_nodes":"1"},"endsAt":"2023-06-12T07:02:00.233Z","fingerprint":"b21bf244f87cd47f","receivers":[{"name":"my_alerts"}],"startsAt":"2023-06-12T06:44:00.233Z","status":{"inhibitedBy":[],"silencedBy":[],"state":"active"},"updatedAt":"2023-06-12T06:58:00.424Z","generatorURL":"
>>>>>>> http://app1:8880/vmalert/alert?group_id=71689142540802366","labels":{"alertgroup":"INFRA","alertname":"The
>>>>>>>  
>>>>>>> number of available Cassandra nodes has 
>>>>>>> changed","server":"main","severity":"Critical"}}]", would it be 
>>>>>>> possible to 
>>>>>>> retrieve this json and post it via curl? This, I assume, wouldn't solve 
>>>>>>> my 
>>>>>>> problem, cause I believe Google API expects something peculiar in terms 
>>>>>>> of 
>>>>>>> the message it receives.
>>>>>>>
>>>>>>> понедельник, 12 июня 2023 г. в 13:04:17 UTC+6, Brian Candler: 
>>>>>>>
>>>>>>>> > Invalid JSON payload received.
>>>>>>>>
>>>>>>>> Alertmanager's webhook sends a JSON message with a *fixed* payload 
>>>>>>>> format. See
>>>>>>>>
>>>>>>>> https://prometheus.io/docs/alerting/latest/configuration/#webhook_config
>>>>>>>> *"The Alertmanager will send HTTP POST requests in the following 
>>>>>>>> JSON format to the configured endpoint"*
>>>>>>>>
>>>>>>>> You can't override it with a template. The Alertmanager JSON format 
>>>>>>>> is different to what Google Chat requires, and therefore you can't 
>>>>>>>> send it 
>>>>>>>> directly.
>>>>>>>>
>>>>>>>> That's why you need a separate piece of software to do the 
>>>>>>>> conversion (Calert in your case) - it receives the Alertmanager 
>>>>>>>> webhook 
>>>>>>>> JSON payload, builds a new payload for the target, and then sends it 
>>>>>>>> there.
>>>>>>>>
>>>>>>>> On Monday, 12 June 2023 at 06:59:14 UTC+1 Near N wrote:
>>>>>>>>
>>>>>>>>> Good day. I was wondering if there is a way to configure 
>>>>>>>>> alertmanager to send notifications to google chat via a webhook. 
>>>>>>>>>
>>>>>>>>> The current setup that I use consists of vmalert (loaded with set 
>>>>>>>>> of promQL compatible rules) >> Alertmanager (to group them up) and 
>>>>>>>>> Calert 
>>>>>>>>> (to send them to google chat). Despite the flowchart is working fine, 
>>>>>>>>> I 
>>>>>>>>> found it difficult to amend proposed message template, so decided to 
>>>>>>>>> simplify it by configuring alertmanager to send the alerts. It dawns 
>>>>>>>>> on me 
>>>>>>>>> that it can operate, but I seem to have failed to fine-tune it. Any 
>>>>>>>>> help 
>>>>>>>>> would be appreciated. The alertmanager.yml is below:
>>>>>>>>>
>>>>>>>>> global:
>>>>>>>>> http_config:
>>>>>>>>> proxy_url: '{{ alertmanager_proxy_url }}'
>>>>>>>>>
>>>>>>>>> route:
>>>>>>>>> receiver: 'my_alerts'
>>>>>>>>> group_wait: 30s
>>>>>>>>> group_interval: 60s
>>>>>>>>> repeat_interval: 15m
>>>>>>>>> group_by: ['room', 'alertName']
>>>>>>>>>
>>>>>>>>> receivers:
>>>>>>>>> - name: 'my_alerts'
>>>>>>>>> webhook_configs:
>>>>>>>>> - url: '{{ alertmanager_chat_webhook }}'
>>>>>>>>> send_resolved: true
>>>>>>>>>
>>>>>>>>> templates:
>>>>>>>>> - '{{ alertmanager_working_directory }}/google-chat.tmpl'
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> And here is the error of alertmanager trying to send an alert:
>>>>>>>>>
>>>>>>>>> Jun 12 05:26:00 app1-cp alertmanager[140337]: 
>>>>>>>>> ts=2023-06-12T05:26:00.599Z caller=dispatch.go:352 level=error 
>>>>>>>>> component=dispatcher msg="Notify for alerts failed" num_alerts=3 
>>>>>>>>> err="my_alerts/webhook[0]: notify retry canceled due to unrecoverable 
>>>>>>>>> error 
>>>>>>>>> after 1 attempts: unexpected status code 400: 
>>>>>>>>> https://chat.googleapis.com/v1/spaces/webook_token: {\n 
>>>>>>>>>  \"error\": {\n    \"code\": 400,\n    \"message\": \"Invalid JSON 
>>>>>>>>> payload 
>>>>>>>>> received. Unknown name \\\"receiver\\\" at 'message': Cannot find 
>>>>>>>>> field.\\nInvalid JSON payload received. Unknown name \\\"status\\\" 
>>>>>>>>> at 
>>>>>>>>> 'message': Cannot find field.\\nInvalid JSON payload received. 
>>>>>>>>> Unknown name 
>>>>>>>>> \\\"alerts\\\" at 'message': Cannot find field.\\nInvalid JSON 
>>>>>>>>> payload 
>>>>>>>>> received. Unknown name \\\"groupLabels\\\" at 'message': Cannot find 
>>>>>>>>> field.\\nInvalid JSON payload received. Unknown name 
>>>>>>>>> \\\"commonLabels\\\" 
>>>>>>>>> at 'message': Cannot find field.\\nInvalid JSON payload received. 
>>>>>>>>> Unknown 
>>>>>>>>> name \\\"commonAnnotations\\\" at 'message': Cannot find 
>>>>>>>>> field.\\nInvalid 
>>>>>>>>> JSON payload received. Unknown name \\\"externalURL\\\" at 'message': 
>>>>>>>>> Cannot find field.\\nInvalid JSON payload received. Unknown name 
>>>>>>>>> \\\"version\\\" at 'message': Cannot find field.\\nInvalid JSON 
>>>>>>>>> payload 
>>>>>>>>> received. Unknown name \\\"groupKey\\\" at 'message': Cannot find 
>>>>>>>>> field.\\nInvalid JSON payload received. Unknown name 
>>>>>>>>> \\\"truncatedAlerts\\\" at 'message': Cannot find field.\",\n   
>>>>>>>>>  \"status\": \"INVALID_ARGUMENT\",\n    \"details\": [\n      {\n     
>>>>>>>>>   
>>>>>>>>>  \"@type\": \"type.googleapis.com/google.rpc.BadRequest\ 
>>>>>>>>> <http://type.googleapis.com/google.rpc.BadRequest%5C>",\n       
>>>>>>>>>  \"fieldViolations\": [\n          {\n            \"field\": 
>>>>>>>>> \"message\",\n 
>>>>>>>>>            \"description\": \"Invalid JSON payload received. Unknown 
>>>>>>>>> name 
>>>>>>>>> \\\"receiver\\\" at 'message': Cannot find field.\"\n          },\n   
>>>>>>>>>       
>>>>>>>>>  {\n            \"field\": \"message\",\n            \"description\": 
>>>>>>>>> \"Invalid JSON payload received. Unknown name \\\"status\\\" at 
>>>>>>>>> 'message': 
>>>>>>>>> Cannot find field.\"\n          },\n          {\n            
>>>>>>>>> \"field\": 
>>>>>>>>> \"message\",\n            \"description\": \"Invalid JSON payload 
>>>>>>>>> received. 
>>>>>>>>> Unknown name \\\"alerts\\\" at 'message': Cannot find field.\"\n      
>>>>>>>>>    
>>>>>>>>>  },\n          {\n            \"field\": \"message\",\n           
>>>>>>>>>  \"description\": \"Invalid JSON payload received. Unknown name 
>>>>>>>>> \\\"groupLabels\\\" at 'message': Cannot find field.\"\n          
>>>>>>>>> },\n     
>>>>>>>>>      {\n            \"field\": \"message\",\n            
>>>>>>>>> \"description\": 
>>>>>>>>> \"Invalid JSON payload received. Unknown name \\\"commonLabels\\\" at 
>>>>>>>>> 'message': Cannot find field.\"\n          },\n          {\n          
>>>>>>>>>  
>>>>>>>>>  \"field\": \"message\",\n            \"description\": \"Invalid JSON 
>>>>>>>>> payload received. Unknown name \\\"commonAnnotations\\\" at 
>>>>>>>>> 'message': 
>>>>>>>>> Cannot find field.\"\n          },\n          {\n            
>>>>>>>>> \"field\": 
>>>>>>>>> \"message\",\n            \"description\": \"Invalid JSON payload 
>>>>>>>>> received. 
>>>>>>>>> Unknown name \\\"externalURL\\\" at 'message': Cannot find field.\"\n 
>>>>>>>>>       
>>>>>>>>>    },\n          {\n            \"field\": \"message\",\n           
>>>>>>>>>  \"description\": \"Invalid JSON payload received. Unknown name 
>>>>>>>>> \\\"version\\\" at 'message': Cannot find field.\"\n          },\n    
>>>>>>>>>      
>>>>>>>>>  {\n            \"field\": \"message\",\n            \"description\": 
>>>>>>>>> \"Invalid JSON payload received. Unknown name \\\"groupKey\\\" at 
>>>>>>>>> 'message': Cannot find field.\"\n          },\n          {\n          
>>>>>>>>>  
>>>>>>>>>  \"field\": \"message\",\n            \"description\": \"Invalid JSON 
>>>>>>>>> payload received. Unknown name \\\"truncatedAlerts\\\" at 'message': 
>>>>>>>>> Cannot 
>>>>>>>>> find field.\"\n          }\n        ]\n      }\n    ]\n  }\n}\n"
>>>>>>>>>
>>>>>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"Prometheus Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/prometheus-users/ff1782ec-85c7-4a34-9c94-fe30e02f2e80n%40googlegroups.com.

Reply via email to