main.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "net/http"
  6. "github.com/kubecost/cost-model/pkg/clustercache"
  7. "github.com/kubecost/cost-model/pkg/env"
  8. "github.com/kubecost/cost-model/pkg/metrics"
  9. "github.com/prometheus/client_golang/prometheus/promhttp"
  10. "github.com/rs/cors"
  11. "k8s.io/client-go/kubernetes"
  12. "k8s.io/client-go/rest"
  13. "k8s.io/client-go/tools/clientcmd"
  14. "k8s.io/klog"
  15. )
  16. func Healthz(w http.ResponseWriter, _ *http.Request) {
  17. w.WriteHeader(200)
  18. w.Header().Set("Content-Length", "0")
  19. w.Header().Set("Content-Type", "text/plain")
  20. }
  21. // initializes the kubernetes client cache
  22. func newKubernetesClusterCache() (clustercache.ClusterCache, error) {
  23. var err error
  24. // Kubernetes API setup
  25. var kc *rest.Config
  26. if kubeconfig := env.GetKubeConfigPath(); kubeconfig != "" {
  27. kc, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
  28. } else {
  29. kc, err = rest.InClusterConfig()
  30. }
  31. if err != nil {
  32. return nil, err
  33. }
  34. kubeClientset, err := kubernetes.NewForConfig(kc)
  35. if err != nil {
  36. return nil, err
  37. }
  38. // Create Kubernetes Cluster Cache + Watchers
  39. k8sCache := clustercache.NewKubernetesClusterCache(kubeClientset)
  40. k8sCache.Run()
  41. return k8sCache, nil
  42. }
  43. func main() {
  44. klog.InitFlags(nil)
  45. flag.Set("v", "3")
  46. flag.Parse()
  47. klog.V(1).Infof("Starting kubecost-metrics...")
  48. // initialize kubernetes client and cluster cache
  49. clusterCache, err := newKubernetesClusterCache()
  50. if err != nil {
  51. panic(err.Error())
  52. }
  53. // initialize Kubernetes Metrics
  54. metrics.InitKubeMetrics(clusterCache, &metrics.KubeMetricsOpts{
  55. EmitKubecostControllerMetrics: true,
  56. EmitNamespaceAnnotations: env.IsEmitNamespaceAnnotationsMetric(),
  57. EmitPodAnnotations: env.IsEmitPodAnnotationsMetric(),
  58. EmitKubeStateMetrics: true,
  59. })
  60. rootMux := http.NewServeMux()
  61. rootMux.HandleFunc("/healthz", Healthz)
  62. rootMux.Handle("/metrics", promhttp.Handler())
  63. handler := cors.AllowAll().Handler(rootMux)
  64. klog.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", env.GetKubecostMetricsPort()), handler))
  65. }