Welcome to my blog.
- I live in Gdańsk, Poland
- I am a Software Engineer & DevOps Engineer
- I am specialising in Go, Kubernetes and AWS
Welcome to my blog.
You may find useful to have Git commit hash and go version in your structured logs with every entry. To achieve it you can use following code. Working code example you can find on GitHub package main import ( "log/slog" "os" "runtime" "runtime/debug" ) var GitCommit = "NOCOMMIT" var GoVersion = runtime.Version() var BuildDate = "" func initVersion() { info, ok := debug.ReadBuildInfo() if !ok { return } modified := false for _, setting := range info....
This is a continuation from previous article How Does Web Work With Go Part 1. To talk with web server, you need to speak the same language. In this case it is protocol HTTP. Currently there are 3 version of this protocol in use: HTTP 1.1 - TCP text format HTTP 2 - TCP binary format HTTP 3 - UDP binary format In our case we will use HTTP 1.1 which is defined in RFC2616....
This evening I was wondering if my 5-year old son would ask me, what is the Internet and how it works, what I would reply to him? Maybe he is a bit young to go into the details, but I would like to explain what I know about it and to structure my knowledge and learn more in the process. Because as Seneka said: while we teach, we learn. I would like to dive deep into the details in this series with some Go examples....
I would like to recommend an ACM membership with Skills Bundle. This gives an access to O’Reilly, Skillsoft Percipio and Pluralsight. The 2024 cost 2024 is $174 per year or $100 if you are from developing countries. This cost is quite high but still way better than O’Reilly access alone which is $499 yearly. Pluralsight (also $499 yearly standard price) gives an access to huge library of video courses which are useful for certificate preparation....
I wanted to create a logging middleware for HTTP client. Working code example you can find on GitHub The basic structure is type LoggingTransport struct { rt http.RoundTripper } func (t *LoggingTransport) RoundTrip(r *http.Request) (*http.Response, error) { // do before request is sent, ex. start timer, log request resp, err := t.rt.RoundTrip(r) // do after the response is received, ex. end timer, log response return resp, err } I found this code in Kubernetes source and I liked this implementation, I decided to adjust it to my needs....
Recently I wanted to learn more about Go’s slog package. Also for some other project I needed to create an access logger. I could not find a solution so I decided to create my own. I was inspired by two solutions: rs/zerolog/hlog package great guide at betterstack Working code example can be found on GitHub Requirements In my logger I wanted to have all standard data: request duration, status code, bytes written, method, url, user agent, remote addr plus some extra...
When working on local environment, it is useful to use trusted TLS certificates. For this purpose we can use mkcert. mkcert automatically creates and installs a local CA in the system root store, and generates locally-trusted certificates. Working code example can be found on GitHub Instalation First we need to install it ❯ mkcert -install The local CA is already installed in the system trust store! 👍 The local CA is already installed in the Firefox trust store!...
I was rereading David Allen’s Getting Things Done recently. I needed to restart my GTD system and it was a good opportunity to review the original system proposed by David Allen. When I was reading Chapter 6 about second step Clarifying, I found a fragment that applies to me. (…) In my early days of coaching I used to give my clients permission to keep a To File pile. No longer....
This is an code based on opentelemetry dice example which uses rs/zerolog and adds trace id to logs. Working code example can be found on GitHub TraceIDHandler This is a standard access logger. What is extra here is traceID := traceIDHandler("trace_id", "span_id") traceIDHandler adds those two fields to zerolog if it finds them in context. func requestLogger(next http.Handler) http.Handler { h := hlog.NewHandler(logger) accessHandler := hlog.AccessHandler(func(r *http.Request, status, size int, duration time....
Graceful shutdown is a technique used to smoothly terminate an app. It allows the clients to receive data from the app. Also it gives time for the load balancer to deregister it and not send a traffic to it. // this is not an app with graceful shutdown package main import ( "fmt" "log" "net/http" "time" ) // this request takes long time to complete func indexHandler(w http.ResponseWriter, r *http.Request) { log....