telemetry.go 3.7 KB

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