Hi, Julius! 
Thanks for quick reply.

Yes, you are right, if I will use separate http.ServeMux on separate server 
I will loose "promhttp_*" metrics for my application(because they will be 
counted for separate server).


I have found the solution, but don't like it.

<pre style='color:#d1d1d1;background:#000000;'>type discardResponseWriter 
<span style='color:#e66170; font-weight:bold; '>struct</span><span 
style='color:#b060b0; '>{</span><span style='color:#b060b0; '>}</span>

func <span style='color:#d2cd86; '>(</span>d <span style='color:#d2cd86; 
'>*</span>discardResponseWriter<span style='color:#d2cd86; '>)</span> 
Header<span style='color:#d2cd86; '>(</span><span style='color:#d2cd86; 
'>)</span> http<span style='color:#d2cd86; '>.</span>Header <span 
style='color:#b060b0; '>{</span>
    <span style='color:#e66170; font-weight:bold; '>return</span> make<span 
style='color:#d2cd86; '>(</span>http<span style='color:#d2cd86; 
'>.</span>Header<span style='color:#d2cd86; '>)</span>
<span style='color:#b060b0; '>}</span>

func <span style='color:#d2cd86; '>(</span>d <span style='color:#d2cd86; 
'>*</span>discardResponseWriter<span style='color:#d2cd86; '>)</span> 
Write<span style='color:#d2cd86; '>(</span>b <span style='color:#d2cd86; 
'>[</span><span style='color:#d2cd86; '>]</span>byte<span 
style='color:#d2cd86; '>)</span> <span style='color:#d2cd86; 
'>(</span><span style='color:#e66170; font-weight:bold; '>int</span><span 
style='color:#d2cd86; '>,</span> error<span style='color:#d2cd86; 
'>)</span> <span style='color:#b060b0; '>{</span>
    <span style='color:#e66170; font-weight:bold; '>return</span> io<span 
style='color:#d2cd86; '>.</span>Discard<span style='color:#d2cd86; 
'>.</span>Write<span style='color:#d2cd86; '>(</span>b<span 
style='color:#d2cd86; '>)</span>
<span style='color:#b060b0; '>}</span>

func <span style='color:#d2cd86; '>(</span>d <span style='color:#d2cd86; 
'>*</span>discardResponseWriter<span style='color:#d2cd86; '>)</span> 
WriteHeader<span style='color:#d2cd86; '>(</span>statusCode <span 
style='color:#e66170; font-weight:bold; '>int</span><span 
style='color:#d2cd86; '>)</span> <span style='color:#b060b0; '>{</span>
<span style='color:#b060b0; '>}</span>

func Middleware<span style='color:#d2cd86; '>(</span><span 
style='color:#d2cd86; '>)</span> func<span style='color:#d2cd86; 
'>(</span>next http<span style='color:#d2cd86; '>.</span><span 
style='color:#e66170; font-weight:bold; '>Handler</span><span 
style='color:#d2cd86; '>)</span> http<span style='color:#d2cd86; 
'>.</span><span style='color:#e66170; font-weight:bold; '>Handler</span> 
<span style='color:#b060b0; '>{</span>
    metric <span style='color:#b060b0; '>:</span><span 
style='color:#d2cd86; '>=</span> prometheus<span style='color:#d2cd86; 
'>.</span>NewHistogramVec<span style='color:#d2cd86; 
'>(</span>prometheus<span style='color:#d2cd86; 
'>.</span>HistogramOpts<span style='color:#ffffff; background:#dd0000; 
'>{</span>
        Name<span style='color:#b060b0; '>:</span> <span 
style='color:#02d045; '>"</span><span style='color:#00c4c4; 
'>promhttp_metric_handler_requests_duration_seconds</span><span 
style='color:#02d045; '>"</span><span style='color:#d2cd86; '>,</span>
        Help<span style='color:#b060b0; '>:</span> <span 
style='color:#02d045; '>"</span><span style='color:#00c4c4; '>Request 
duration for method + url in seconds</span><span style='color:#02d045; 
'>"</span><span style='color:#d2cd86; '>,</span>
    <span style='color:#ffffff; background:#dd0000; '>}</span><span 
style='color:#d2cd86; '>,</span> <span style='color:#d2cd86; 
'>[</span><span style='color:#d2cd86; '>]</span>string<span 
style='color:#ffffff; background:#dd0000; '>{</span><span 
style='color:#02d045; '>"</span><span style='color:#00c4c4; 
'>method</span><span style='color:#02d045; '>"</span><span 
style='color:#d2cd86; '>,</span> <span style='color:#02d045; 
'>"</span><span style='color:#00c4c4; '>url</span><span 
style='color:#02d045; '>"</span><span style='color:#ffffff; 
background:#dd0000; '>}</span><span style='color:#d2cd86; '>)</span>

    prometheus<span style='color:#d2cd86; '>.</span>MustRegister<span 
style='color:#d2cd86; '>(</span>metric<span style='color:#d2cd86; '>)</span>

    h <span style='color:#b060b0; '>:</span><span style='color:#d2cd86; 
'>=</span> promhttp<span style='color:#d2cd86; '>.</span><span 
style='color:#e66170; font-weight:bold; '>Handler</span><span 
style='color:#d2cd86; '>(</span><span style='color:#d2cd86; '>)</span>

    <span style='color:#e66170; font-weight:bold; '>return</span> func<span 
style='color:#d2cd86; '>(</span>next http<span style='color:#d2cd86; 
'>.</span><span style='color:#e66170; font-weight:bold; 
'>Handler</span><span style='color:#d2cd86; '>)</span> http<span 
style='color:#d2cd86; '>.</span><span style='color:#e66170; 
font-weight:bold; '>Handler</span> <span style='color:#b060b0; '>{</span>
        <span style='color:#e66170; font-weight:bold; '>return</span> 
http<span style='color:#d2cd86; '>.</span>HandlerFunc<span 
style='color:#d2cd86; '>(</span>func<span style='color:#d2cd86; '>(</span>w 
http<span style='color:#d2cd86; '>.</span>ResponseWriter<span 
style='color:#d2cd86; '>,</span> r <span style='color:#d2cd86; 
'>*</span>http<span style='color:#d2cd86; '>.</span>Request<span 
style='color:#d2cd86; '>)</span> <span style='color:#ffffff; 
background:#dd0000; '>{</span>
            h<span style='color:#d2cd86; '>.</span>ServeHTTP<span 
style='color:#d2cd86; '>(</span><span style='color:#d2cd86; 
'>&amp;</span>discardResponseWriter<span style='color:#ffffff; 
background:#dd0000; '>{</span><span style='color:#ffffff; 
background:#dd0000; '>}</span><span style='color:#d2cd86; '>,</span> r<span 
style='color:#d2cd86; '>)</span>
            start <span style='color:#b060b0; '>:</span><span 
style='color:#d2cd86; '>=</span> time<span style='color:#d2cd86; 
'>.</span>Now<span style='color:#d2cd86; '>(</span><span 
style='color:#d2cd86; '>)</span>
            next<span style='color:#d2cd86; '>.</span>ServeHTTP<span 
style='color:#d2cd86; '>(</span>w<span style='color:#d2cd86; '>,</span> 
r<span style='color:#d2cd86; '>)</span>
            metric<span style='color:#d2cd86; 
'>.</span>WithLabelValues<span style='color:#d2cd86; '>(</span>r<span 
style='color:#d2cd86; '>.</span>Method<span style='color:#d2cd86; 
'>,</span> r<span style='color:#d2cd86; '>.</span>URL<span 
style='color:#d2cd86; '>.</span>Path<span style='color:#d2cd86; 
'>)</span><span style='color:#d2cd86; '>.</span>Observe<span 
style='color:#d2cd86; '>(</span>time<span style='color:#d2cd86; 
'>.</span>Since<span style='color:#d2cd86; '>(</span>start<span 
style='color:#d2cd86; '>)</span><span style='color:#d2cd86; 
'>.</span>Seconds<span style='color:#d2cd86; '>(</span><span 
style='color:#d2cd86; '>)</span><span style='color:#d2cd86; '>)</span>
        <span style='color:#ffffff; background:#dd0000; '>}</span><span 
style='color:#d2cd86; '>)</span>
    <span style='color:#b060b0; '>}</span>
<span style='color:#b060b0; '>}</span>
</pre>
<!--Created using ToHtml.com on 2022-08-17 09:54:56 UTC -->

вторник, 16 августа 2022 г. в 21:05:14 UTC+3, [email protected]: 

> Hi Alex,
>
> both approaches are generally fine, based on your needs. With "losing 
> instrumentation metrics", do you mean the "promhttp_*" metrics about the 
> scrape itself? Those should still be present when just using 
> "promhttp.Handler()" on a different http.ServeMux and starting a second 
> server for that ServeMux. Could you share the relevant lines of your code 
> and/or elaborate?
>
> Regards,
> Julius
>
> On Mon, Aug 15, 2022 at 11:34 PM Oleksandr Matsak <[email protected]> 
> wrote:
>
>> Hi!
>>
>> I have REST API application and looking for solution for exposing metrics 
>> endpoint for internal only access.
>>
>> I can see two options:
>>
>>    1. use same *http.Server* as application and protect endpoint with 
>>    supported auth flow (basic, token, etc)
>>    2. use different *http.Server* on internal port without any 
>>    authentication
>>
>> First has drawback of hardcoding auth credentials on both infrastructure 
>> and application sides, I want to avoid it.
>>
>> While considering second, found that if just put *promhttp.Handler* to 
>> separate server I will loose instrumentation metrics.
>>
>> So how do I see it: 
>>
>>    - put instrumentation metrics middleware to application server
>>    - run another server on internal only port with metrics output handler
>>
>> Any advise ? 
>>
>> Thanks,
>> Alex
>>
>> -- 
>> 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/54038168-acda-40f2-97f7-7fc1212e926cn%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/prometheus-users/54038168-acda-40f2-97f7-7fc1212e926cn%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>
>
> -- 
> Julius Volz
> PromLabs - promlabs.com
>

-- 
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/4c5d624c-80db-4723-aa3e-9dd7ea7c0870n%40googlegroups.com.

Reply via email to