telemetry.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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("non-server nodes", d.Count.NonServer).
  40. Set("extclients", d.ExtClients).
  41. Set("users", d.Users).
  42. Set("networks", d.Networks).
  43. Set("linux", d.Count.Linux).
  44. Set("darwin", d.Count.MacOS).
  45. Set("windows", d.Count.Windows).
  46. Set("freebsd", d.Count.FreeBSD).
  47. Set("docker", d.Count.Docker).
  48. Set("k8s", d.Count.K8S).
  49. Set("version", d.Version),
  50. })
  51. }
  52. // fetchTelemetry - fetches telemetry data: count of various object types in DB
  53. func fetchTelemetryData() (telemetryData, error) {
  54. var data telemetryData
  55. data.ExtClients = getDBLength(database.EXT_CLIENT_TABLE_NAME)
  56. data.Users = getDBLength(database.USERS_TABLE_NAME)
  57. data.Networks = getDBLength(database.NETWORKS_TABLE_NAME)
  58. data.Version = servercfg.GetVersion()
  59. nodes, err := GetAllNodes()
  60. if err == nil {
  61. data.Nodes = len(nodes)
  62. data.Count = getClientCount(nodes)
  63. }
  64. return data, err
  65. }
  66. // setTelemetryTimestamp - Give the entry in the DB a new timestamp
  67. func setTelemetryTimestamp(telRecord *models.Telemetry) error {
  68. lastsend := time.Now().Unix()
  69. var serverTelData = models.Telemetry{
  70. UUID: telRecord.UUID,
  71. LastSend: lastsend,
  72. TrafficKeyPriv: telRecord.TrafficKeyPriv,
  73. TrafficKeyPub: telRecord.TrafficKeyPub,
  74. }
  75. jsonObj, err := json.Marshal(&serverTelData)
  76. if err != nil {
  77. return err
  78. }
  79. err = database.Insert(database.SERVER_UUID_RECORD_KEY, string(jsonObj), database.SERVER_UUID_TABLE_NAME)
  80. return err
  81. }
  82. // getClientCount - returns counts of nodes with various OS types and conditions
  83. func getClientCount(nodes []models.Node) clientCount {
  84. var count clientCount
  85. for _, node := range nodes {
  86. switch node.OS {
  87. case "macos":
  88. count.MacOS += 1
  89. case "windows":
  90. count.Windows += 1
  91. case "linux":
  92. count.Linux += 1
  93. case "freebsd":
  94. count.FreeBSD += 1
  95. }
  96. if !(node.IsServer == "yes") {
  97. count.NonServer += 1
  98. }
  99. }
  100. return count
  101. }
  102. // fetchTelemetryRecord - get the existing UUID and Timestamp from the DB
  103. func fetchTelemetryRecord() (models.Telemetry, error) {
  104. var rawData string
  105. var telObj models.Telemetry
  106. var err error
  107. rawData, err = database.FetchRecord(database.SERVER_UUID_TABLE_NAME, database.SERVER_UUID_RECORD_KEY)
  108. if err != nil {
  109. return telObj, err
  110. }
  111. err = json.Unmarshal([]byte(rawData), &telObj)
  112. return telObj, err
  113. }
  114. // getDBLength - get length of DB to get count of objects
  115. func getDBLength(dbname string) int {
  116. data, err := database.FetchRecords(dbname)
  117. if err != nil {
  118. return 0
  119. }
  120. return len(data)
  121. }
  122. // telemetryData - What data to send to posthog
  123. type telemetryData struct {
  124. Nodes int
  125. ExtClients int
  126. Users int
  127. Count clientCount
  128. Networks int
  129. Version string
  130. }
  131. // clientCount - What types of netclients we're tallying
  132. type clientCount struct {
  133. MacOS int
  134. Windows int
  135. Linux int
  136. FreeBSD int
  137. K8S int
  138. Docker int
  139. NonServer int
  140. }