Go언어 golang

golang pretty progress bar

미래의 고 2023. 3. 9. 23:43

 

일하다 보면 데몬 구동 시 상태를 가시적으로 보여주고 싶을 때가 있습니다.
그래서 progress bar를 가끔 사용하곤 하는데 새로운 오픈소스를 찾아서 포스팅해 봅니다.
이런 것이 업무에는 도움이 안 되긴 하지만, 때론 고객사 엔지니어가 봤을 때 나름 있어 보이는 행위라 생각하는 저는 챙기곤 합니다.
 
차후 nginx, postgresql, node 가지고 정말 구동시켜가면서 프로그레스 바가 동작하는 것도 업데이트하겠습니다.
 
오늘은 짧게 샘플만 포스팅하시죠.
 

 

package main

import (
   "flag"
   "fmt"
   "time"

   "github.com/jedib0t/go-pretty/v6/progress"
   "github.com/jedib0t/go-pretty/v6/text"
)

var (
   flagNumTrackers = flag.Int("num-trackers", 3, "Number of Trackers")
)

func trackSomething(pw progress.Writer, updateMessage bool, message string) {
   units := &progress.UnitsDefault
   tracker := progress.Tracker{Message: message, Total: 30, Units: *units}

   pw.AppendTracker(&tracker)

   ticker := time.Tick(time.Millisecond * 500)
   updateTicker := time.Tick(time.Millisecond * 250)
   for !tracker.IsDone() {
      select {
      case <-ticker:
         tracker.Increment(int64(5))
         if 5 == int64(*flagNumTrackers) && tracker.Value() >= 30 {
            tracker.MarkAsDone()
         }
      case <-updateTicker:
         if updateMessage {
            tracker.UpdateMessage(text.FgGreen.Sprint(message))
         }
      }
   }
}

func main() {
   fmt.Println("Start 'The Golang of future'")

   pw := progress.NewWriter()
   pw.SetTrackerLength(25)
   pw.SetMessageWidth(24)
   pw.SetTrackerPosition(progress.PositionRight)

   go pw.Render()

   trackSomething(pw, true, "postgresql")
   trackSomething(pw, true, "node")
   trackSomething(pw, true, "nginx")

   time.Sleep(time.Second)
   fmt.Println("\nSuccess Service Start")
   for {
   } // hold & need daemonize
}