telemetry.go 3.9 KB

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