github.com/tickoalcantara12/micro/v3@v3.0.0-20221007104245-9d75b9bcbab9/cmd/usage/client/main.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"net/http"
     8  	"os"
     9  	"sort"
    10  	"strings"
    11  )
    12  
    13  type Result struct {
    14  	Count map[string]int64 `json:"count"`
    15  }
    16  
    17  func printKey(k string, v int64) {
    18  	if v == 0 {
    19  		return
    20  	}
    21  
    22  	var u string
    23  	var c float64
    24  
    25  	switch {
    26  	case v > 1e9:
    27  		c = float64(v) / 1e9
    28  		u = "b"
    29  	case v > 1e6:
    30  		c = float64(v) / 1e6
    31  		u = "m"
    32  	case v > 1e4:
    33  		c = float64(v) / 1e3
    34  		u = "k"
    35  	default:
    36  		c = float64(v)
    37  	}
    38  
    39  	fmt.Printf("micro %s:\t%.2f%s\n", k, c, u)
    40  }
    41  
    42  func years() [][]byte {
    43  	var years [][]byte
    44  
    45  	for _, year := range []string{"2019", "2020", "2021"} {
    46  		rsp, err := http.Get("https://go.micro.mu/usage?date=" + year)
    47  		if err != nil {
    48  			fmt.Println(err)
    49  			return nil
    50  		}
    51  		defer rsp.Body.Close()
    52  
    53  		b, err := ioutil.ReadAll(rsp.Body)
    54  		if err != nil {
    55  			fmt.Println(err)
    56  			return nil
    57  		}
    58  
    59  		years = append(years, b)
    60  	}
    61  
    62  	return years
    63  }
    64  
    65  func main() {
    66  	var cKey string
    67  	if len(os.Args) > 1 {
    68  		cKey = os.Args[1]
    69  	}
    70  
    71  	var results map[string]Result
    72  
    73  	counts := map[string]int64{}
    74  	highest := map[string]int64{}
    75  	//	daily := map[string]int64{}
    76  	monthly := map[string]int64{}
    77  
    78  	// get all the results
    79  	for _, year := range years() {
    80  		var res map[string]Result
    81  
    82  		if err := json.Unmarshal(year, &results); err != nil {
    83  			fmt.Println(err)
    84  			return
    85  		}
    86  
    87  		for k, v := range res {
    88  			results[k] = v
    89  		}
    90  	}
    91  
    92  	for k, v := range results {
    93  		// 20190520-micro.new
    94  		parts := strings.Split(k, ".")
    95  		if len(parts) < 2 {
    96  			continue
    97  		}
    98  
    99  		// micro.new
   100  		key := parts[len(parts)-1]
   101  
   102  		if len(cKey) > 0 && key != cKey {
   103  			continue
   104  		}
   105  
   106  		// counts[micro.new] += requests
   107  		c := counts[key]
   108  		c += v.Count["requests"]
   109  		// save
   110  		counts[key] = c
   111  
   112  		// set highest
   113  		if i := highest[key]; v.Count["requests"] > i {
   114  			highest[key] = v.Count["requests"]
   115  		}
   116  
   117  		// set monthly
   118  		month := parts[0][:6]
   119  		mkey := key + " (" + month + ")"
   120  		c = monthly[mkey]
   121  		c += v.Count["requests"]
   122  		monthly[mkey] = c
   123  	}
   124  
   125  	fmt.Println("Total requests:")
   126  
   127  	for k, v := range counts {
   128  		printKey(k, v)
   129  	}
   130  
   131  	fmt.Println("\nHighest requests:")
   132  
   133  	for k, v := range highest {
   134  		printKey(k, v)
   135  	}
   136  
   137  	fmt.Println("\nMonthly requests:")
   138  	var keys []string
   139  	for k, _ := range monthly {
   140  		keys = append(keys, k)
   141  	}
   142  
   143  	sort.Strings(keys)
   144  
   145  	for _, k := range keys {
   146  		printKey(k, monthly[k])
   147  	}
   148  }