net.SplitHostPort only works if you provide both address and port, and it 
only accepts IPv6 literals if they are in square brackets.

https://go.dev/play/p/ezUD89xLd6z

Therefore I think the logic has to be more sophisticated:
* Contains no colons: just a hostname
* Contains exactly one colon: parse with SplitHostPort
* Contains two or more colons:
    * does not start with "[": just a hostname
    * starts with "[" and ends with "]": just a hostname inside the brackets
    * otherwise: parse with SplitHostPort

On Friday 15 December 2023 at 11:29:04 UTC Brian Candler wrote:

> Done:
> https://github.com/prometheus/snmp_exporter/issues/1076
> https://github.com/prometheus/blackbox_exporter/issues/1171
>
> BTW, there's no problem with http prober and URLs with IPv6 literals. It 
> turns out the http prober module I was testing with initially had
>       preferred_ip_protocol: "ip4"
>       ip_protocol_fallback: false
>
> On Friday 15 December 2023 at 07:04:02 UTC Ben Kochie wrote:
>
>> Oh, I forgot to add, it would be helpful to file issues on the affected 
>> repos.
>>
>> On Fri, Dec 15, 2023 at 8:03 AM Ben Kochie <[email protected]> wrote:
>>
>>> Yea, that's some inconsistency we should fix. I agree, we should allow 
>>> square brackets everywhere, but only require them if a port is required.
>>>
>>> Consistently using https://pkg.go.dev/net#SplitHostPort should help.
>>>
>>> On Thu, Dec 14, 2023 at 7:01 PM 'Brian Candler' via Prometheus Users <
>>> [email protected]> wrote:
>>>
>>>> I'd like to raise this as a general issue for discussion.  I am working 
>>>> with these:
>>>>
>>>> blackbox_exporter, version 0.24.0 (branch: HEAD, revision: 
>>>> 0b0467473916fd9e8526e2635c2a0b1c56011dff)
>>>>   build user:       root@e5bbfcc8184e
>>>>   build date:       20230516-11:07:25
>>>>   go version:       go1.20.4
>>>>   platform:         linux/amd64
>>>>   tags:             netgo
>>>>
>>>> snmp_exporter, version 0.25.0 (branch: HEAD, revision: 
>>>> 9c42d6c874d479314e612bca69558c81f8e26287)
>>>>   build user:       root@880115266f70
>>>>   build date:       20231210-10:05:18
>>>>   go version:       go1.21.5
>>>>   platform:         linux/amd64
>>>>   tags:             netgo
>>>>
>>>> In blackbox_exporter, it's inconsistent whether IPv6 literals need to 
>>>> be enclosed in square brackets or not.
>>>>
>>>> - With the icmp prober, IPv6 literals *must not* be enclosed in 
>>>> brackets AFAICS
>>>> - With the dns prober, IPv6 literals *must not* be enclosed in 
>>>> brackets, unless you also provide a port. e.g. [::1] is invalid, but 
>>>> [::1]:53 is OK, as far as I can tell
>>>> - With the tcp prober, I don't think the port can be omitted anyway; 
>>>> hence IPv6 literals *must* be enclosed in brackets and followed by :port
>>>>
>>>> This makes it difficult to write generic code to map a device to a 
>>>> target plus module, because it depends on what underlying prober the 
>>>> module 
>>>> is using.
>>>>
>>>> Looking at the wider Prometheus ecosystem:
>>>>
>>>> - Prometheus service discovery requires square brackets, because 
>>>> __address__ is an address:port combination
>>>> - snmp_exporter does *not* allow the square brackets in the target 
>>>> address if it doesn't have a port. Conversely, you can add the square 
>>>> brackets, but if you do you *must* add a port; it doesn't add :161 
>>>> automatically.  (This is like the dns prober in blackbox_exporter)
>>>>
>>>> # curl -vsS 
>>>> 'localhost:9116/snmp?target=[2001:db8::1]&module=mikrotik&auth=workshop_v3'
>>>> error collecting metric Desc{fqName: "snmp_error", help: "Error 
>>>> scraping target", constLabels: {module="mikrotik"}, variableLabels: {}}: 
>>>> error connecting to target [2001:db8::1]: error establishing connection to 
>>>> host: dial udp: address [[2001:db8::1]]:161: missing port in address
>>>>
>>>> That looks like a straightforward bug to me: it seems to be attempting 
>>>> to add the :161 port, but is mangling it with an extra set of brackets.
>>>>
>>>> If that can be fixed (and maybe it's the same issue in dns prober), 
>>>> then it will be possible to use brackets around IPv6 addresses without 
>>>> ports.
>>>>
>>>> That leaves the icmp prober in blackbox exporter. I think it should 
>>>> allow square brackets, if not actually require them (there's no useful 
>>>> concept of "port" here, it will always send an echo-request). It might be 
>>>> more consistent to require square brackets
>>>>
>>>> P.S. I would expect the blackbox_exporter http prober to require square 
>>>> brackets around IPv6 literals in URLs, but I can't them to work: e.g.
>>>> curl -g 
>>>> 'localhost:9115/probe?target=http:%2f%2f%5b2001:db8::1%5d&module=http_2xx_example'
>>>> doesn't make an outbound connection to 2001:db8::1. But quite possibly 
>>>> I'm doing something wrong.
>>>>
>>>> -- 
>>>> 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/433eea9b-2b74-4375-9112-ca671baf84c9n%40googlegroups.com
>>>>  
>>>> <https://groups.google.com/d/msgid/prometheus-users/433eea9b-2b74-4375-9112-ca671baf84c9n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>>

-- 
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/bc60aab2-d8b1-4278-ab37-cce4e9d5b460n%40googlegroups.com.

Reply via email to