telemetry.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  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. TrafficKey: telRecord.TrafficKey,
  73. }
  74. jsonObj, err := json.Marshal(&serverTelData)
  75. if err != nil {
  76. return err
  77. }
  78. err = database.Insert(database.SERVER_UUID_RECORD_KEY, string(jsonObj), database.SERVER_UUID_TABLE_NAME)
  79. return err
  80. }
  81. // getClientCount - returns counts of nodes with various OS types and conditions
  82. func getClientCount(nodes []models.Node) clientCount {
  83. var count clientCount
  84. for _, node := range nodes {
  85. switch node.OS {
  86. case "macos":
  87. count.MacOS += 1
  88. case "windows":
  89. count.Windows += 1
  90. case "linux":
  91. count.Linux += 1
  92. case "freebsd":
  93. count.FreeBSD += 1
  94. }
  95. if !(node.IsServer == "yes") {
  96. count.NonServer += 1
  97. }
  98. }
  99. return count
  100. }
  101. // fetchTelemetryRecord - get the existing UUID and Timestamp from the DB
  102. func fetchTelemetryRecord() (models.Telemetry, error) {
  103. var rawData string
  104. var telObj models.Telemetry
  105. var err error
  106. rawData, err = database.FetchRecord(database.SERVER_UUID_TABLE_NAME, database.SERVER_UUID_RECORD_KEY)
  107. if err != nil {
  108. return telObj, err
  109. }
  110. err = json.Unmarshal([]byte(rawData), &telObj)
  111. return telObj, err
  112. }
  113. // getDBLength - get length of DB to get count of objects
  114. func getDBLength(dbname string) int {
  115. data, err := database.FetchRecords(dbname)
  116. if err != nil {
  117. return 0
  118. }
  119. return len(data)
  120. }
  121. // telemetryData - What data to send to posthog
  122. type telemetryData struct {
  123. Nodes int
  124. ExtClients int
  125. Users int
  126. Count clientCount
  127. Networks int
  128. Version string
  129. }
  130. // clientCount - What types of netclients we're tallying
  131. type clientCount struct {
  132. MacOS int
  133. Windows int
  134. Linux int
  135. FreeBSD int
  136. K8S int
  137. Docker int
  138. NonServer int
  139. }