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.

