process.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. // Copyright The OpenTelemetry Authors
  2. //
  3. // Licensed under the Apache License, Version 2.0 (the "License");
  4. // you may not use this file except in compliance with the License.
  5. // You may obtain a copy of the License at
  6. //
  7. // http://www.apache.org/licenses/LICENSE-2.0
  8. //
  9. // Unless required by applicable law or agreed to in writing, software
  10. // distributed under the License is distributed on an "AS IS" BASIS,
  11. // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. // See the License for the specific language governing permissions and
  13. // limitations under the License.
  14. package resource // import "go.opentelemetry.io/otel/sdk/resource"
  15. import (
  16. "context"
  17. "fmt"
  18. "os"
  19. "os/user"
  20. "path/filepath"
  21. "runtime"
  22. semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
  23. )
  24. type pidProvider func() int
  25. type executablePathProvider func() (string, error)
  26. type commandArgsProvider func() []string
  27. type ownerProvider func() (*user.User, error)
  28. type runtimeNameProvider func() string
  29. type runtimeVersionProvider func() string
  30. type runtimeOSProvider func() string
  31. type runtimeArchProvider func() string
  32. var (
  33. defaultPidProvider pidProvider = os.Getpid
  34. defaultExecutablePathProvider executablePathProvider = os.Executable
  35. defaultCommandArgsProvider commandArgsProvider = func() []string { return os.Args }
  36. defaultOwnerProvider ownerProvider = user.Current
  37. defaultRuntimeNameProvider runtimeNameProvider = func() string {
  38. if runtime.Compiler == "gc" {
  39. return "go"
  40. }
  41. return runtime.Compiler
  42. }
  43. defaultRuntimeVersionProvider runtimeVersionProvider = runtime.Version
  44. defaultRuntimeOSProvider runtimeOSProvider = func() string { return runtime.GOOS }
  45. defaultRuntimeArchProvider runtimeArchProvider = func() string { return runtime.GOARCH }
  46. )
  47. var (
  48. pid = defaultPidProvider
  49. executablePath = defaultExecutablePathProvider
  50. commandArgs = defaultCommandArgsProvider
  51. owner = defaultOwnerProvider
  52. runtimeName = defaultRuntimeNameProvider
  53. runtimeVersion = defaultRuntimeVersionProvider
  54. runtimeOS = defaultRuntimeOSProvider
  55. runtimeArch = defaultRuntimeArchProvider
  56. )
  57. func setDefaultOSProviders() {
  58. setOSProviders(
  59. defaultPidProvider,
  60. defaultExecutablePathProvider,
  61. defaultCommandArgsProvider,
  62. )
  63. }
  64. func setOSProviders(
  65. pidProvider pidProvider,
  66. executablePathProvider executablePathProvider,
  67. commandArgsProvider commandArgsProvider,
  68. ) {
  69. pid = pidProvider
  70. executablePath = executablePathProvider
  71. commandArgs = commandArgsProvider
  72. }
  73. func setDefaultRuntimeProviders() {
  74. setRuntimeProviders(
  75. defaultRuntimeNameProvider,
  76. defaultRuntimeVersionProvider,
  77. defaultRuntimeOSProvider,
  78. defaultRuntimeArchProvider,
  79. )
  80. }
  81. func setRuntimeProviders(
  82. runtimeNameProvider runtimeNameProvider,
  83. runtimeVersionProvider runtimeVersionProvider,
  84. runtimeOSProvider runtimeOSProvider,
  85. runtimeArchProvider runtimeArchProvider,
  86. ) {
  87. runtimeName = runtimeNameProvider
  88. runtimeVersion = runtimeVersionProvider
  89. runtimeOS = runtimeOSProvider
  90. runtimeArch = runtimeArchProvider
  91. }
  92. func setDefaultUserProviders() {
  93. setUserProviders(defaultOwnerProvider)
  94. }
  95. func setUserProviders(ownerProvider ownerProvider) {
  96. owner = ownerProvider
  97. }
  98. type processPIDDetector struct{}
  99. type processExecutableNameDetector struct{}
  100. type processExecutablePathDetector struct{}
  101. type processCommandArgsDetector struct{}
  102. type processOwnerDetector struct{}
  103. type processRuntimeNameDetector struct{}
  104. type processRuntimeVersionDetector struct{}
  105. type processRuntimeDescriptionDetector struct{}
  106. // Detect returns a *Resource that describes the process identifier (PID) of the
  107. // executing process.
  108. func (processPIDDetector) Detect(ctx context.Context) (*Resource, error) {
  109. return NewWithAttributes(semconv.SchemaURL, semconv.ProcessPID(pid())), nil
  110. }
  111. // Detect returns a *Resource that describes the name of the process executable.
  112. func (processExecutableNameDetector) Detect(ctx context.Context) (*Resource, error) {
  113. executableName := filepath.Base(commandArgs()[0])
  114. return NewWithAttributes(semconv.SchemaURL, semconv.ProcessExecutableName(executableName)), nil
  115. }
  116. // Detect returns a *Resource that describes the full path of the process executable.
  117. func (processExecutablePathDetector) Detect(ctx context.Context) (*Resource, error) {
  118. executablePath, err := executablePath()
  119. if err != nil {
  120. return nil, err
  121. }
  122. return NewWithAttributes(semconv.SchemaURL, semconv.ProcessExecutablePath(executablePath)), nil
  123. }
  124. // Detect returns a *Resource that describes all the command arguments as received
  125. // by the process.
  126. func (processCommandArgsDetector) Detect(ctx context.Context) (*Resource, error) {
  127. return NewWithAttributes(semconv.SchemaURL, semconv.ProcessCommandArgs(commandArgs()...)), nil
  128. }
  129. // Detect returns a *Resource that describes the username of the user that owns the
  130. // process.
  131. func (processOwnerDetector) Detect(ctx context.Context) (*Resource, error) {
  132. owner, err := owner()
  133. if err != nil {
  134. return nil, err
  135. }
  136. return NewWithAttributes(semconv.SchemaURL, semconv.ProcessOwner(owner.Username)), nil
  137. }
  138. // Detect returns a *Resource that describes the name of the compiler used to compile
  139. // this process image.
  140. func (processRuntimeNameDetector) Detect(ctx context.Context) (*Resource, error) {
  141. return NewWithAttributes(semconv.SchemaURL, semconv.ProcessRuntimeName(runtimeName())), nil
  142. }
  143. // Detect returns a *Resource that describes the version of the runtime of this process.
  144. func (processRuntimeVersionDetector) Detect(ctx context.Context) (*Resource, error) {
  145. return NewWithAttributes(semconv.SchemaURL, semconv.ProcessRuntimeVersion(runtimeVersion())), nil
  146. }
  147. // Detect returns a *Resource that describes the runtime of this process.
  148. func (processRuntimeDescriptionDetector) Detect(ctx context.Context) (*Resource, error) {
  149. runtimeDescription := fmt.Sprintf(
  150. "go version %s %s/%s", runtimeVersion(), runtimeOS(), runtimeArch())
  151. return NewWithAttributes(
  152. semconv.SchemaURL,
  153. semconv.ProcessRuntimeDescription(runtimeDescription),
  154. ), nil
  155. }