telemetry.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package logic
  2. import (
  3. "encoding/json"
  4. "time"
  5. "github.com/gravitl/netmaker/database"
  6. "github.com/gravitl/netmaker/models"
  7. "github.com/gravitl/netmaker/servercfg"
  8. "github.com/posthog/posthog-go"
  9. )
  10. // posthog_pub_key - Key for sending data to PostHog
  11. const posthog_pub_key = "phc_1vEXhPOA1P7HP5jP2dVU9xDTUqXHAelmtravyZ1vvES"
  12. // posthog_endpoint - Endpoint of PostHog server
  13. const posthog_endpoint = "https://app.posthog.com"
  14. // sendTelemetry - gathers telemetry data and sends to posthog
  15. func sendTelemetry() error {
  16. if servercfg.Telemetry() == "off" {
  17. return nil
  18. }
  19. var telRecord, err = fetchTelemetryRecord()
  20. if err != nil {
  21. return err
  22. }
  23. // get telemetry data
  24. d, err := fetchTelemetryData()
  25. if err != nil {
  26. return err
  27. }
  28. client, err := posthog.NewWithConfig(posthog_pub_key, posthog.Config{Endpoint: posthog_endpoint})
  29. if err != nil {
  30. return err
  31. }
  32. defer client.Close()
  33. // send to posthog
  34. return client.Enqueue(posthog.Capture{
  35. DistinctId: telRecord.UUID,
  36. Event: "daily checkin",
  37. Properties: posthog.NewProperties().
  38. Set("nodes", d.Nodes).
  39. Set("servers", d.Servers).
  40. Set("non-server nodes", d.Count.NonServer).
  41. Set("extclients", d.ExtClients).
  42. Set("users", d.Users).
  43. Set("networks", d.Networks).
  44. Set("linux", d.Count.Linux).
  45. Set("darwin", d.Count.MacOS).
  46. Set("windows", d.Count.Windows).
  47. Set("freebsd", d.Count.FreeBSD).
  48. Set("docker", d.Count.Docker).
  49. Set("k8s", d.Count.K8S).
  50. Set("version", d.Version),
  51. })
  52. }
  53. // fetchTelemetry - fetches telemetry data: count of various object types in DB
  54. func fetchTelemetryData() (telemetryData, error) {
  55. var data telemetryData
  56. data.ExtClients = getDBLength(database.EXT_CLIENT_TABLE_NAME)
  57. data.Users = getDBLength(database.USERS_TABLE_NAME)
  58. data.Networks = getDBLength(database.NETWORKS_TABLE_NAME)
  59. data.Version = servercfg.GetVersion()
  60. data.Servers = GetServerCount()
  61. nodes, err := GetAllNodes()
  62. if err == nil {
  63. data.Nodes = len(nodes)
  64. data.Count = getClientCount(nodes)
  65. }
  66. return data, err
  67. }
  68. // setTelemetryTimestamp - Give the entry in the DB a new timestamp
  69. func setTelemetryTimestamp(telRecord *models.Telemetry) error {
  70. lastsend := time.Now().Unix()
  71. var serverTelData = models.Telemetry{
  72. UUID: telRecord.UUID,
  73. LastSend: lastsend,
  74. TrafficKeyPriv: telRecord.TrafficKeyPriv,
  75. TrafficKeyPub: telRecord.TrafficKeyPub,
  76. }
  77. jsonObj, err := json.Marshal(&serverTelData)
  78. if err != nil {
  79. return err
  80. }
  81. err = database.Insert(database.SERVER_UUID_RECORD_KEY, string(jsonObj), database.SERVER_UUID_TABLE_NAME)
  82. return err
  83. }
  84. // getClientCount - returns counts of nodes with various OS types and conditions
  85. func getClientCount(nodes []models.Node) clientCount {
  86. var count clientCount
  87. for _, node := range nodes {
  88. switch node.OS {
  89. case "darwin":
  90. count.MacOS += 1
  91. case "windows":
  92. count.Windows += 1
  93. case "linux":
  94. count.Linux += 1
  95. case "freebsd":
  96. count.FreeBSD += 1
  97. }
  98. if !(node.IsServer == "yes") {
  99. count.NonServer += 1
  100. }
  101. }
  102. return count
  103. }
  104. // fetchTelemetryRecord - get the existing UUID and Timestamp from the DB
  105. func fetchTelemetryRecord() (models.Telemetry, error) {
  106. var rawData string
  107. var telObj models.Telemetry
  108. var err error
  109. rawData, err = database.FetchRecord(database.SERVER_UUID_TABLE_NAME, database.SERVER_UUID_RECORD_KEY)
  110. if err != nil {
  111. return telObj, err
  112. }
  113. err = json.Unmarshal([]byte(rawData), &telObj)
  114. return telObj, err
  115. }
  116. // getDBLength - get length of DB to get count of objects
  117. func getDBLength(dbname string) int {
  118. data, err := database.FetchRecords(dbname)
  119. if err != nil {
  120. return 0
  121. }
  122. return len(data)
  123. }
  124. // telemetryData - What data to send to posthog
  125. type telemetryData struct {
  126. Nodes int
  127. ExtClients int
  128. Users int
  129. Count clientCount
  130. Networks int
  131. Servers int
  132. Version string
  133. }
  134. // clientCount - What types of netclients we're tallying
  135. type clientCount struct {
  136. MacOS int
  137. Windows int
  138. Linux int
  139. FreeBSD int
  140. K8S int
  141. Docker int
  142. NonServer int
  143. }