@gitpod/gitpod-protocol 0.1.5-me-version.1 → 0.1.5-me-ingress.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (272) hide show
  1. package/data/gitpod-schema.json +11 -4
  2. package/lib/accounting-protocol.d.ts +3 -6
  3. package/lib/accounting-protocol.d.ts.map +1 -1
  4. package/lib/accounting-protocol.js +10 -16
  5. package/lib/accounting-protocol.js.map +1 -1
  6. package/lib/admin-protocol.d.ts +9 -4
  7. package/lib/admin-protocol.d.ts.map +1 -1
  8. package/lib/admin-protocol.js +2 -13
  9. package/lib/admin-protocol.js.map +1 -1
  10. package/lib/analytics.d.ts +45 -0
  11. package/lib/analytics.d.ts.map +1 -0
  12. package/lib/analytics.js +10 -0
  13. package/lib/analytics.js.map +1 -0
  14. package/lib/context-url.d.ts +18 -0
  15. package/lib/context-url.d.ts.map +1 -0
  16. package/lib/context-url.js +49 -0
  17. package/lib/context-url.js.map +1 -0
  18. package/lib/{util/context-url.spec.d.ts → context-url.spec.d.ts} +2 -0
  19. package/lib/context-url.spec.d.ts.map +1 -0
  20. package/lib/context-url.spec.js +73 -0
  21. package/lib/context-url.spec.js.map +1 -0
  22. package/lib/email-protocol.d.ts +1 -2
  23. package/lib/email-protocol.d.ts.map +1 -1
  24. package/lib/email-protocol.js +4 -4
  25. package/lib/email-protocol.js.map +1 -1
  26. package/lib/encryption/container-module.js +4 -4
  27. package/lib/encryption/container-module.js.map +1 -1
  28. package/lib/encryption/encryption-engine.js +19 -20
  29. package/lib/encryption/encryption-engine.js.map +1 -1
  30. package/lib/encryption/encryption-engine.spec.js +29 -36
  31. package/lib/encryption/encryption-engine.spec.js.map +1 -1
  32. package/lib/encryption/encryption-service.js +29 -43
  33. package/lib/encryption/encryption-service.js.map +1 -1
  34. package/lib/encryption/key-provider.js +25 -30
  35. package/lib/encryption/key-provider.js.map +1 -1
  36. package/lib/env.d.ts +1 -2
  37. package/lib/env.d.ts.map +1 -1
  38. package/lib/env.js +20 -21
  39. package/lib/env.js.map +1 -1
  40. package/lib/gitpod-file-parser.js +25 -41
  41. package/lib/gitpod-file-parser.js.map +1 -1
  42. package/lib/gitpod-file-parser.spec.js +116 -116
  43. package/lib/gitpod-file-parser.spec.js.map +1 -1
  44. package/lib/gitpod-service.d.ts +86 -9
  45. package/lib/gitpod-service.d.ts.map +1 -1
  46. package/lib/gitpod-service.js +150 -295
  47. package/lib/gitpod-service.js.map +1 -1
  48. package/lib/headless-workspace-log.d.ts +8 -11
  49. package/lib/headless-workspace-log.d.ts.map +1 -1
  50. package/lib/headless-workspace-log.js +4 -7
  51. package/lib/headless-workspace-log.js.map +1 -1
  52. package/lib/ide-protocol.d.ts +81 -0
  53. package/lib/ide-protocol.d.ts.map +1 -0
  54. package/lib/ide-protocol.js +8 -0
  55. package/lib/ide-protocol.js.map +1 -0
  56. package/lib/index.d.ts +4 -0
  57. package/lib/index.d.ts.map +1 -1
  58. package/lib/index.js +4 -0
  59. package/lib/index.js.map +1 -1
  60. package/lib/messaging/browser/connection.d.ts +3 -3
  61. package/lib/messaging/browser/connection.d.ts.map +1 -1
  62. package/lib/messaging/browser/connection.js +172 -35
  63. package/lib/messaging/browser/connection.js.map +1 -1
  64. package/lib/messaging/browser/window-connection.js +35 -55
  65. package/lib/messaging/browser/window-connection.js.map +1 -1
  66. package/lib/messaging/client-call-metrics.d.ts +35 -0
  67. package/lib/messaging/client-call-metrics.d.ts.map +1 -0
  68. package/lib/messaging/client-call-metrics.js +83 -0
  69. package/lib/messaging/client-call-metrics.js.map +1 -0
  70. package/lib/messaging/connection-error-handler.js +11 -23
  71. package/lib/messaging/connection-error-handler.js.map +1 -1
  72. package/lib/messaging/error.d.ts +2 -1
  73. package/lib/messaging/error.d.ts.map +1 -1
  74. package/lib/messaging/error.js +4 -2
  75. package/lib/messaging/error.js.map +1 -1
  76. package/lib/messaging/handler.d.ts +10 -0
  77. package/lib/messaging/handler.d.ts.map +1 -1
  78. package/lib/messaging/node/connection.d.ts +0 -10
  79. package/lib/messaging/node/connection.d.ts.map +1 -1
  80. package/lib/messaging/node/connection.js +12 -50
  81. package/lib/messaging/node/connection.js.map +1 -1
  82. package/lib/messaging/proxy-factory.d.ts +2 -0
  83. package/lib/messaging/proxy-factory.d.ts.map +1 -1
  84. package/lib/messaging/proxy-factory.js +74 -159
  85. package/lib/messaging/proxy-factory.js.map +1 -1
  86. package/lib/oss-allowlist.d.ts +14 -0
  87. package/lib/oss-allowlist.d.ts.map +1 -0
  88. package/lib/oss-allowlist.js +8 -0
  89. package/lib/oss-allowlist.js.map +1 -0
  90. package/lib/permission.d.ts +1 -2
  91. package/lib/permission.d.ts.map +1 -1
  92. package/lib/permission.js +12 -13
  93. package/lib/permission.js.map +1 -1
  94. package/lib/plans.d.ts +1 -1
  95. package/lib/plans.d.ts.map +1 -1
  96. package/lib/plans.js +38 -57
  97. package/lib/plans.js.map +1 -1
  98. package/lib/protocol.d.ts +50 -48
  99. package/lib/protocol.d.ts.map +1 -1
  100. package/lib/protocol.js +57 -114
  101. package/lib/protocol.js.map +1 -1
  102. package/lib/snapshot-url.d.ts +14 -0
  103. package/lib/snapshot-url.d.ts.map +1 -0
  104. package/lib/snapshot-url.js +26 -0
  105. package/lib/snapshot-url.js.map +1 -0
  106. package/{src/util/without.ts → lib/snapshot-url.spec.d.ts} +2 -3
  107. package/lib/snapshot-url.spec.d.ts.map +1 -0
  108. package/lib/snapshot-url.spec.js +41 -0
  109. package/lib/snapshot-url.spec.js.map +1 -0
  110. package/lib/team-subscription-protocol.d.ts +3 -3
  111. package/lib/team-subscription-protocol.d.ts.map +1 -1
  112. package/lib/team-subscription-protocol.js +15 -12
  113. package/lib/team-subscription-protocol.js.map +1 -1
  114. package/lib/teams-projects-protocol.d.ts +110 -0
  115. package/lib/teams-projects-protocol.d.ts.map +1 -0
  116. package/lib/teams-projects-protocol.js +23 -0
  117. package/lib/teams-projects-protocol.js.map +1 -0
  118. package/lib/util/analytics.d.ts +1 -26
  119. package/lib/util/analytics.d.ts.map +1 -1
  120. package/lib/util/analytics.js +36 -28
  121. package/lib/util/analytics.js.map +1 -1
  122. package/lib/util/async-iterator.js +55 -133
  123. package/lib/util/async-iterator.js.map +1 -1
  124. package/lib/util/cancelable.js +17 -59
  125. package/lib/util/cancelable.js.map +1 -1
  126. package/lib/util/date-time.js +8 -8
  127. package/lib/util/date-time.js.map +1 -1
  128. package/lib/util/deferred.js +10 -12
  129. package/lib/util/deferred.js.map +1 -1
  130. package/lib/util/disposable.js +26 -39
  131. package/lib/util/disposable.js.map +1 -1
  132. package/lib/util/event.js +58 -74
  133. package/lib/util/event.js.map +1 -1
  134. package/lib/util/garbage-collected-cache.d.ts +1 -0
  135. package/lib/util/garbage-collected-cache.d.ts.map +1 -1
  136. package/lib/util/garbage-collected-cache.js +26 -46
  137. package/lib/util/garbage-collected-cache.js.map +1 -1
  138. package/lib/util/generate-workspace-id.d.ts +1 -1
  139. package/lib/util/generate-workspace-id.d.ts.map +1 -1
  140. package/lib/util/generate-workspace-id.js +29 -68
  141. package/lib/util/generate-workspace-id.js.map +1 -1
  142. package/lib/util/generate-workspace-id.spec.js +56 -78
  143. package/lib/util/generate-workspace-id.spec.js.map +1 -1
  144. package/lib/util/gitpod-cookie.d.ts +20 -0
  145. package/lib/util/gitpod-cookie.d.ts.map +1 -0
  146. package/lib/util/gitpod-cookie.js +44 -0
  147. package/lib/util/gitpod-cookie.js.map +1 -0
  148. package/lib/util/gitpod-host-url.d.ts +1 -0
  149. package/lib/util/gitpod-host-url.d.ts.map +1 -1
  150. package/lib/util/gitpod-host-url.js +96 -103
  151. package/lib/util/gitpod-host-url.js.map +1 -1
  152. package/lib/util/gitpod-host-url.spec.js +87 -135
  153. package/lib/util/gitpod-host-url.spec.js.map +1 -1
  154. package/lib/util/grpc.d.ts +15 -0
  155. package/lib/util/grpc.d.ts.map +1 -0
  156. package/lib/util/grpc.js +18 -0
  157. package/lib/util/grpc.js.map +1 -0
  158. package/lib/util/jaeger-client-types.d.ts +68 -0
  159. package/lib/util/jaeger-client-types.d.ts.map +1 -0
  160. package/lib/util/{without.js → jaeger-client-types.js} +1 -1
  161. package/lib/util/jaeger-client-types.js.map +1 -0
  162. package/lib/util/logging.d.ts +49 -33
  163. package/lib/util/logging.d.ts.map +1 -1
  164. package/lib/util/logging.js +107 -110
  165. package/lib/util/logging.js.map +1 -1
  166. package/lib/util/make-link.js +2 -2
  167. package/lib/util/make-link.js.map +1 -1
  168. package/lib/util/parse-workspace-id.d.ts +10 -0
  169. package/lib/util/parse-workspace-id.d.ts.map +1 -1
  170. package/lib/util/parse-workspace-id.js +31 -7
  171. package/lib/util/parse-workspace-id.js.map +1 -1
  172. package/lib/util/parse-workspace-id.spec.d.ts +4 -0
  173. package/lib/util/parse-workspace-id.spec.d.ts.map +1 -1
  174. package/lib/util/parse-workspace-id.spec.js +123 -84
  175. package/lib/util/parse-workspace-id.spec.js.map +1 -1
  176. package/lib/util/queue.js +16 -55
  177. package/lib/util/queue.js.map +1 -1
  178. package/lib/util/queue.spec.js +144 -288
  179. package/lib/util/queue.spec.js.map +1 -1
  180. package/lib/util/repeat.d.ts +15 -0
  181. package/lib/util/repeat.d.ts.map +1 -0
  182. package/lib/util/repeat.js +55 -0
  183. package/lib/util/repeat.js.map +1 -0
  184. package/lib/util/safe-promise.js +9 -12
  185. package/lib/util/safe-promise.js.map +1 -1
  186. package/lib/util/semaphore.js +15 -46
  187. package/lib/util/semaphore.js.map +1 -1
  188. package/lib/util/skip-if.js +6 -6
  189. package/lib/util/skip-if.js.map +1 -1
  190. package/lib/util/timeutil.js +16 -16
  191. package/lib/util/timeutil.js.map +1 -1
  192. package/lib/util/timeutil.spec.js +21 -24
  193. package/lib/util/timeutil.spec.js.map +1 -1
  194. package/lib/util/tracing.d.ts +50 -5
  195. package/lib/util/tracing.d.ts.map +1 -1
  196. package/lib/util/tracing.js +175 -63
  197. package/lib/util/tracing.js.map +1 -1
  198. package/lib/util/tracing.spec.d.ts +7 -0
  199. package/lib/util/tracing.spec.d.ts.map +1 -0
  200. package/lib/util/tracing.spec.js +121 -0
  201. package/lib/util/tracing.spec.js.map +1 -0
  202. package/lib/util/workspace-port-authentication.js +2 -2
  203. package/lib/util/workspace-port-authentication.js.map +1 -1
  204. package/lib/workspace-cluster.d.ts +12 -3
  205. package/lib/workspace-cluster.d.ts.map +1 -1
  206. package/lib/workspace-cluster.js +3 -3
  207. package/lib/workspace-cluster.js.map +1 -1
  208. package/lib/workspace-instance.d.ts +5 -2
  209. package/lib/workspace-instance.d.ts.map +1 -1
  210. package/lib/wsready.js +1 -1
  211. package/package.json +24 -13
  212. package/pkg-yarn.lock +14 -7
  213. package/provenance-bundle.jsonl +2 -0
  214. package/src/accounting-protocol.ts +4 -10
  215. package/src/admin-protocol.ts +10 -5
  216. package/src/analytics.ts +54 -0
  217. package/src/context-url.spec.ts +39 -0
  218. package/src/context-url.ts +51 -0
  219. package/src/email-protocol.ts +2 -3
  220. package/src/env.ts +10 -10
  221. package/src/gitpod-service.ts +101 -17
  222. package/src/headless-workspace-log.ts +7 -11
  223. package/src/ide-protocol.ts +92 -0
  224. package/src/index.ts +4 -0
  225. package/src/messaging/browser/connection.ts +176 -10
  226. package/src/messaging/client-call-metrics.ts +97 -0
  227. package/src/messaging/error.ts +5 -2
  228. package/src/messaging/handler.ts +12 -0
  229. package/src/messaging/node/connection.ts +3 -47
  230. package/src/messaging/proxy-factory.ts +13 -5
  231. package/src/oss-allowlist.ts +15 -0
  232. package/src/permission.ts +0 -1
  233. package/src/protocol.ts +68 -56
  234. package/src/snapshot-url.spec.ts +25 -0
  235. package/src/snapshot-url.ts +27 -0
  236. package/src/team-subscription-protocol.ts +6 -4
  237. package/src/teams-projects-protocol.ts +141 -0
  238. package/src/util/analytics.ts +17 -30
  239. package/src/util/garbage-collected-cache.ts +7 -1
  240. package/src/util/generate-workspace-id.spec.ts +16 -0
  241. package/src/util/generate-workspace-id.ts +20 -2
  242. package/src/util/gitpod-cookie.ts +39 -0
  243. package/src/util/gitpod-host-url.ts +12 -8
  244. package/src/util/grpc.ts +15 -0
  245. package/src/util/jaeger-client-types.ts +102 -0
  246. package/src/util/logging.ts +102 -38
  247. package/src/util/parse-workspace-id.spec.ts +21 -1
  248. package/src/util/parse-workspace-id.ts +32 -6
  249. package/src/util/repeat.ts +45 -0
  250. package/src/util/tracing.spec.ts +83 -0
  251. package/src/util/tracing.ts +162 -18
  252. package/src/workspace-cluster.ts +9 -3
  253. package/src/workspace-instance.ts +18 -6
  254. package/src/wsready.ts +1 -1
  255. package/lib/util/context-url.d.ts +0 -13
  256. package/lib/util/context-url.d.ts.map +0 -1
  257. package/lib/util/context-url.js +0 -26
  258. package/lib/util/context-url.js.map +0 -1
  259. package/lib/util/context-url.spec.d.ts.map +0 -1
  260. package/lib/util/context-url.spec.js +0 -52
  261. package/lib/util/context-url.spec.js.map +0 -1
  262. package/lib/util/repeater.d.ts +0 -22
  263. package/lib/util/repeater.d.ts.map +0 -1
  264. package/lib/util/repeater.js +0 -118
  265. package/lib/util/repeater.js.map +0 -1
  266. package/lib/util/without.d.ts +0 -7
  267. package/lib/util/without.d.ts.map +0 -1
  268. package/lib/util/without.js.map +0 -1
  269. package/src/util/context-url.spec.ts +0 -25
  270. package/src/util/context-url.ts +0 -23
  271. package/src/util/jaeger-client.d.ts +0 -105
  272. package/src/util/repeater.ts +0 -49
@@ -30,66 +30,66 @@ export interface LogPayload {
30
30
  };
31
31
 
32
32
  export namespace log {
33
- export function error(context: LogContext, message: string, error: Error, payload: LogPayload): void;
34
- export function error(context: LogContext, message: string, error: Error): void;
33
+ export function error(context: LogContext, message: string, error: any, payload: LogPayload): void;
34
+ export function error(context: LogContext, message: string, error: any): void;
35
35
  export function error(context: LogContext, message: string, payload: LogPayload): void;
36
36
  export function error(context: LogContext, message: string): void;
37
- export function error(context: LogContext, error: Error, payload: LogPayload): void;
38
- export function error(context: LogContext, error: Error): void;
39
- export function error(message: string, error: Error, payload: LogPayload): void;
40
- export function error(message: string, error: Error): void;
37
+ export function error(context: LogContext, error: any, payload: LogPayload): void;
38
+ export function error(context: LogContext, error: any): void;
39
+ export function error(message: string, error: any, payload: LogPayload): void;
40
+ export function error(message: string, error: any): void;
41
41
  export function error(message: string, payload: LogPayload): void;
42
42
  export function error(message: string): void;
43
- export function error(error: Error, payload: LogPayload): void;
44
- export function error(error: Error): void;
43
+ export function error(error: any, payload: LogPayload): void;
44
+ export function error(error: any): void;
45
45
  export function error(...args: any[]): void {
46
46
  errorLog(false, args);
47
47
  }
48
48
 
49
- export function warn(context: LogContext, message: string, error: Error, payload: LogPayload): void;
50
- export function warn(context: LogContext, message: string, error: Error): void;
49
+ export function warn(context: LogContext, message: string, error: any, payload: LogPayload): void;
50
+ export function warn(context: LogContext, message: string, error: any): void;
51
51
  export function warn(context: LogContext, message: string, payload: LogPayload): void;
52
52
  export function warn(context: LogContext, message: string): void;
53
- export function warn(context: LogContext, error: Error, payload: LogPayload): void;
54
- export function warn(context: LogContext, error: Error): void;
55
- export function warn(message: string, error: Error, payload: LogPayload): void;
56
- export function warn(message: string, error: Error): void;
53
+ export function warn(context: LogContext, error: any, payload: LogPayload): void;
54
+ export function warn(context: LogContext, error: any): void;
55
+ export function warn(message: string, error: any, payload: LogPayload): void;
56
+ export function warn(message: string, error: any): void;
57
57
  export function warn(message: string, payload: LogPayload): void;
58
58
  export function warn(message: string): void;
59
- export function warn(error: Error, payload: LogPayload): void;
60
- export function warn(error: Error): void;
59
+ export function warn(error: any, payload: LogPayload): void;
60
+ export function warn(error: any): void;
61
61
  export function warn(...args: any[]): void {
62
62
  warnLog(false, args);
63
63
  }
64
64
 
65
- export function info(context: LogContext, message: string, error: Error, payload: LogPayload): void;
66
- export function info(context: LogContext, message: string, error: Error): void;
65
+ export function info(context: LogContext, message: string, error: any, payload: LogPayload): void;
66
+ export function info(context: LogContext, message: string, error: any): void;
67
67
  export function info(context: LogContext, message: string, payload: LogPayload): void;
68
68
  export function info(context: LogContext, message: string): void;
69
- export function info(context: LogContext, error: Error, payload: LogPayload): void;
70
- export function info(context: LogContext, error: Error): void;
71
- export function info(message: string, error: Error, payload: LogPayload): void;
72
- export function info(message: string, error: Error): void;
69
+ export function info(context: LogContext, error: any, payload: LogPayload): void;
70
+ export function info(context: LogContext, error: any): void;
71
+ export function info(message: string, error: any, payload: LogPayload): void;
72
+ export function info(message: string, error: any): void;
73
73
  export function info(message: string, payload: LogPayload): void;
74
74
  export function info(message: string): void;
75
- export function info(error: Error, payload: LogPayload): void;
76
- export function info(error: Error): void;
75
+ export function info(error: any, payload: LogPayload): void;
76
+ export function info(error: any): void;
77
77
  export function info(...args: any[]): void {
78
78
  infoLog(false, args);
79
79
  }
80
80
 
81
- export function debug(context: LogContext, message: string, error: Error, payload: LogPayload): void;
82
- export function debug(context: LogContext, message: string, error: Error): void;
81
+ export function debug(context: LogContext, message: string, error: any, payload: LogPayload): void;
82
+ export function debug(context: LogContext, message: string, error: any): void;
83
83
  export function debug(context: LogContext, message: string, payload: LogPayload): void;
84
84
  export function debug(context: LogContext, message: string): void;
85
- export function debug(context: LogContext, error: Error, payload: LogPayload): void;
86
- export function debug(context: LogContext, error: Error): void;
87
- export function debug(message: string, error: Error, payload: LogPayload): void;
88
- export function debug(message: string, error: Error): void;
85
+ export function debug(context: LogContext, error: any, payload: LogPayload): void;
86
+ export function debug(context: LogContext, error: any): void;
87
+ export function debug(message: string, error: any, payload: LogPayload): void;
88
+ export function debug(message: string, error: any): void;
89
89
  export function debug(message: string, payload: LogPayload): void;
90
90
  export function debug(message: string): void;
91
- export function debug(error: Error, payload: LogPayload): void;
92
- export function debug(error: Error): void;
91
+ export function debug(error: any, payload: LogPayload): void;
92
+ export function debug(error: any): void;
93
93
  export function debug(...args: any[]): void {
94
94
  debugLog(false, args);
95
95
  }
@@ -97,10 +97,14 @@ export namespace log {
97
97
  /**
98
98
  * Do not use in frontend.
99
99
  */
100
- export function enableJSONLogging(componentArg: string, versionArg: string | undefined): void {
100
+ export function enableJSONLogging(componentArg: string, versionArg: string | undefined, logLevel?: LogrusLogLevel): void {
101
101
  component = componentArg;
102
102
  version = versionArg;
103
103
 
104
+ setLogLevel(logLevel);
105
+ }
106
+
107
+ export function setLogLevel(logLevel: LogrusLogLevel | undefined) {
104
108
  jsonLogging = true;
105
109
 
106
110
  console.error = function (...args: any[]): void {
@@ -115,8 +119,20 @@ export namespace log {
115
119
  console.debug = function (...args: any[]): void {
116
120
  debugLog(true, args);
117
121
  }
122
+
118
123
  console.log = console.info;
119
124
  // FIXME wrap also other console methods (e.g. trace())
125
+
126
+ // set/unset log functions based on loglevel so we only have to evaluate once, not every call
127
+ const noop = () => {};
128
+ const setLog = (logFunc: DoLogFunction, funcLevel: LogrusLogLevel): DoLogFunction => {
129
+ return LogrusLogLevel.isGreatherOrEqual(funcLevel, logLevel) ? logFunc : noop;
130
+ };
131
+
132
+ errorLog = setLog(doErrorLog, "error");
133
+ warnLog = setLog(doWarnLog, "warning");
134
+ infoLog = setLog(doInfoLog, "info");
135
+ debugLog = setLog(doDebugLog, "debug");
120
136
  }
121
137
 
122
138
  export function resetToDefaultLogging(): void {
@@ -128,24 +144,73 @@ export namespace log {
128
144
  console.info = infoConsoleLog;
129
145
  console.debug = debugConsoleLog;
130
146
  }
147
+
148
+ export function setVersion(versionArg: string) {
149
+ version = versionArg;
150
+ }
131
151
  }
132
152
 
133
- function errorLog(calledViaConsole: boolean, args: any[]): void {
153
+ type DoLogFunction = (calledViaConsole: boolean, args: any[]) => void;
154
+
155
+ let errorLog = doErrorLog;
156
+ function doErrorLog(calledViaConsole: boolean, args: any[]): void {
134
157
  doLog(calledViaConsole, errorConsoleLog, 'ERROR', args);
135
158
  }
136
159
 
137
- function warnLog(calledViaConsole: boolean, args: any[]): void {
160
+ let warnLog = doWarnLog;
161
+ function doWarnLog(calledViaConsole: boolean, args: any[]): void {
138
162
  doLog(calledViaConsole, warnConsoleLog, 'WARNING', args);
139
163
  }
140
164
 
141
- function infoLog(calledViaConsole: boolean, args: any[]): void {
165
+ let infoLog = doInfoLog;
166
+ function doInfoLog(calledViaConsole: boolean, args: any[]): void {
142
167
  doLog(calledViaConsole, infoConsoleLog, 'INFO', args);
143
168
  }
144
169
 
145
- function debugLog(calledViaConsole: boolean, args: any[]): void {
170
+ let debugLog = doDebugLog;
171
+ function doDebugLog(calledViaConsole: boolean, args: any[]): void {
146
172
  doLog(calledViaConsole, debugConsoleLog, 'DEBUG', args);
147
173
  }
148
174
 
175
+ // Ref: https://github.com/sirupsen/logrus#level-logging
176
+ export type LogrusLogLevel = keyof (typeof LogrusLogLevels);
177
+ export const LogrusLogLevels = {
178
+ trace: true,
179
+ debug: true,
180
+ info: true,
181
+ warning: true,
182
+ error: true,
183
+ fatal: true,
184
+ panic: true,
185
+ }
186
+ export namespace LogrusLogLevel {
187
+ export function isGreatherOrEqual(lvl: LogrusLogLevel | undefined, ref: LogrusLogLevel | undefined): boolean {
188
+ if (lvl === undefined) {
189
+ return false;
190
+ }
191
+ if (ref === undefined) {
192
+ return true;
193
+ }
194
+ return getLevelArity(lvl) >= getLevelArity(ref);
195
+ }
196
+ function getLevelArity(lvl: LogrusLogLevel): number {
197
+ return Object.keys(LogrusLogLevels)
198
+ .findIndex((l) => l === lvl);
199
+ }
200
+ export function getFromEnv(): LogrusLogLevel | undefined {
201
+ const lvlStr = process.env.LOG_LEVEL;
202
+ if (!lvlStr) {
203
+ return undefined;
204
+ }
205
+ const lvl = lvlStr as LogrusLogLevel;
206
+ const exists = LogrusLogLevels[lvl]
207
+ if (!exists) {
208
+ return undefined;
209
+ }
210
+ return lvl;
211
+ }
212
+ }
213
+
149
214
  // Source: https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
150
215
  type GoogleLogSeverity = 'EMERGENCY' | 'ALERT' | 'CRITICAL' | 'ERROR' | 'WARNING' | 'INFO' | 'DEBUG';
151
216
  namespace GoogleLogSeverity {
@@ -243,7 +308,6 @@ function makeLogItem(severity: GoogleLogSeverity, context: LogContext | undefine
243
308
  severity,
244
309
  time: new Date().toISOString(),
245
310
  environment: process.env.KUBE_STAGE,
246
- region: process.env.GITPOD_REGION,
247
311
  context,
248
312
  message,
249
313
  error,
@@ -6,7 +6,7 @@
6
6
 
7
7
  import * as chai from 'chai';
8
8
  import { suite, test } from 'mocha-typescript';
9
- import { parseWorkspaceIdFromHostname } from './parse-workspace-id';
9
+ import { matchesInstanceIdOrLegacyWorkspaceIdExactly, matchesNewWorkspaceIdExactly, parseWorkspaceIdFromHostname } from './parse-workspace-id';
10
10
  const expect = chai.expect;
11
11
 
12
12
  @suite
@@ -52,5 +52,25 @@ export class ParseWorkspaceIdTest {
52
52
  const actual = parseWorkspaceIdFromHostname("webview-3000-ca81a50f-09d7-465c-acd9-264a747d5351.ws-eu01.some.subdomain.somehost.com");
53
53
  expect(actual).to.equal("ca81a50f-09d7-465c-acd9-264a747d5351");
54
54
  }
55
+
56
+ // match - instance ID
57
+ @test public matchesInstanceIdOrLegacyWorkspaceIdExactly_positive() {
58
+ const actual = matchesInstanceIdOrLegacyWorkspaceIdExactly("b7e0eaf8-ec73-44ec-81ea-04859263b656");
59
+ expect(actual).to.be.true;
60
+ }
61
+ @test public matchesInstanceIdOrLegacyWorkspaceIdExactly_negative() {
62
+ const actual = matchesInstanceIdOrLegacyWorkspaceIdExactly("b7e0eaf8-ec73-44ec-81a-04859263b656");
63
+ expect(actual).to.be.false;
64
+ }
65
+
66
+ // match - new workspace ID
67
+ @test public matchesWorkspaceIdExactly_new_positive() {
68
+ const actual = matchesNewWorkspaceIdExactly("moccasin-ferret-155799b3");
69
+ expect(actual).to.be.true;
70
+ }
71
+ @test public matchesWorkspaceIdExactly_new_negative() {
72
+ const actual = matchesNewWorkspaceIdExactly("moccasin-ferret-15599b3");
73
+ expect(actual).to.be.false;
74
+ }
55
75
  }
56
76
  module.exports = new ParseWorkspaceIdTest()
@@ -4,6 +4,14 @@
4
4
  * See License-AGPL.txt in the project root for license information.
5
5
  */
6
6
 
7
+ const REGEX_WORKSPACE_ID = /[0-9a-z]{2,16}-[0-9a-z]{2,16}-[0-9a-z]{8,11}/;
8
+ const REGEX_WORKSPACE_ID_EXACT = new RegExp(`^${REGEX_WORKSPACE_ID.source}$`);
9
+ // We need to parse the workspace id precisely here to get the case '<some-str>-<port>-<wsid>.ws.' right
10
+ const REGEX_WORKSPACE_ID_FROM_HOSTNAME = new RegExp(`(${REGEX_WORKSPACE_ID.source})\.ws`);
11
+
12
+ const REGEX_WORKSPACE_ID_LEGACY = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/;
13
+ const REGEX_WORKSPACE_ID_LEGACY_EXACT = new RegExp(`^${REGEX_WORKSPACE_ID_LEGACY.source}$`);
14
+ const REGEX_WORKSPACE_ID_LEGACY_FROM_HOSTNAME = new RegExp(`(${REGEX_WORKSPACE_ID_LEGACY.source})\.ws`);
7
15
 
8
16
  /**
9
17
  * Hostname may be of the form:
@@ -13,17 +21,35 @@
13
21
  * @param hostname The hostname the request is headed to
14
22
  */
15
23
  export const parseWorkspaceIdFromHostname = function(hostname: string) {
16
- // We need to parse the workspace id precisely here to get the case '<some-str>-<port>-<wsid>.ws.' right
17
- const wsIdExpression = /([0-9a-z]{2,16}-[0-9a-z]{2,16}-[0-9a-z]{8})\.ws/g;
18
- const match = wsIdExpression.exec(hostname);
24
+ const match = REGEX_WORKSPACE_ID_FROM_HOSTNAME.exec(hostname);
19
25
  if (match && match.length >= 2) {
20
26
  return match[1];
21
27
  } else {
22
- const legacyUrlFormat = /([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\.ws/g;
23
- const legacyMatch = legacyUrlFormat.exec(hostname);
28
+ const legacyMatch = REGEX_WORKSPACE_ID_LEGACY_FROM_HOSTNAME.exec(hostname);
24
29
  if (legacyMatch && legacyMatch.length >= 2) {
25
30
  return legacyMatch[1];
26
31
  }
27
32
  return undefined;
28
33
  }
29
- }
34
+ };
35
+
36
+ /** Equalls UUIDv4 (and REGEX_WORKSPACE_ID_LEGACY!) */
37
+ const REGEX_INSTANCE_ID = /[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/;
38
+ const REGEX_INSTANCE_ID_EXACT = new RegExp(`^${REGEX_INSTANCE_ID.source}$`);
39
+
40
+ /**
41
+ * @param maybeId
42
+ * @returns
43
+ */
44
+ export const matchesInstanceIdOrLegacyWorkspaceIdExactly = function(maybeId: string): boolean {
45
+ return REGEX_INSTANCE_ID_EXACT.test(maybeId)
46
+ || REGEX_WORKSPACE_ID_LEGACY_EXACT.test(maybeId);
47
+ };
48
+
49
+ /**
50
+ * @param maybeWorkspaceId
51
+ * @returns
52
+ */
53
+ export const matchesNewWorkspaceIdExactly = function(maybeWorkspaceId: string): boolean {
54
+ return REGEX_WORKSPACE_ID_EXACT.test(maybeWorkspaceId);
55
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Copyright (c) 2021 Gitpod GmbH. All rights reserved.
3
+ * Licensed under the GNU Affero General Public License (AGPL).
4
+ * See License-AGPL.txt in the project root for license information.
5
+ */
6
+
7
+ import { Disposable } from "..";
8
+ import { log } from "./logging";
9
+
10
+ /**
11
+ * This intends to be a drop-in replacement for 'setInterval' implemented with a 'setTimeout' chain
12
+ * to ensure we're not creating more timeouts than we can process.
13
+ * @param op
14
+ * @param everyMilliseconds
15
+ * @returns
16
+ */
17
+ export function repeat(op: () => Promise<void> | void, everyMilliseconds: number): Disposable {
18
+ let timer: NodeJS.Timeout | undefined = undefined;
19
+ let stopped = false;
20
+ const repeated = () => {
21
+ if (stopped) {
22
+ // in case we missed the clearTimeout i 'await'
23
+ return;
24
+ }
25
+
26
+ timer = setTimeout(async () => {
27
+ try {
28
+ await op();
29
+ } catch (err) {
30
+ // catch error here to
31
+ log.error(err);
32
+ }
33
+
34
+ repeated(); // chain ourselves - after the 'await'
35
+ }, everyMilliseconds);
36
+ };
37
+ repeated();
38
+
39
+ return Disposable.create(() => {
40
+ stopped = true;
41
+ if (timer) {
42
+ clearTimeout(timer);
43
+ }
44
+ });
45
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Copyright (c) 2021 Gitpod GmbH. All rights reserved.
3
+ * Licensed under the GNU Affero General Public License (AGPL).
4
+ * See License-AGPL.txt in the project root for license information.
5
+ */
6
+
7
+ import { suite, test } from "mocha-typescript"
8
+ import * as chai from "chai"
9
+ import { TraceContext } from "./tracing";
10
+ import { MockTracer } from "opentracing";
11
+
12
+ const expect = chai.expect
13
+
14
+ @suite class TestTracing {
15
+
16
+ @test public async testTracingContext_addNestedTags() {
17
+ const tracer = new MockTracer();
18
+ const span = tracer.startSpan('testTracingContext_addNestedTags');
19
+ TraceContext.addNestedTags({ span }, {
20
+ rpc: {
21
+ system: "jsonrpc",
22
+ jsonrpc: {
23
+ version: "1.0",
24
+ method: "test",
25
+ parameters: ["abc", "def"],
26
+ },
27
+ },
28
+ });
29
+
30
+ const mockSpan = tracer.report().spans[0];
31
+ expect(mockSpan.tags()).to.deep.equal({
32
+ "rpc.system": "jsonrpc",
33
+ "rpc.jsonrpc.version": "1.0",
34
+ "rpc.jsonrpc.method": "test",
35
+ "rpc.jsonrpc.parameters.0": "abc",
36
+ "rpc.jsonrpc.parameters.1": "def",
37
+ });
38
+ }
39
+
40
+ @test public async testTracingContext_addNestedTags_null() {
41
+ const tracer = new MockTracer();
42
+ const span = tracer.startSpan('testTracingContext_addNestedTags_null');
43
+ TraceContext.addNestedTags({ span }, {
44
+ someShape: {
45
+ thisIsNull: null,
46
+ thisIsUndefined: undefined,
47
+ },
48
+ });
49
+
50
+ const mockSpan = tracer.report().spans[0];
51
+ expect(mockSpan.tags()).to.deep.equal({
52
+ "someShape.thisIsNull": null,
53
+ "someShape.thisIsUndefined": undefined,
54
+ });
55
+ }
56
+
57
+ @test public async testTracingContext_addJsonRPCParameters() {
58
+ const tracer = new MockTracer();
59
+ const span = tracer.startSpan('testTracingContext_addJsonRPCParameters');
60
+ const ctx = { span };
61
+ TraceContext.addJsonRPCParameters(ctx, {
62
+ one: "one",
63
+ two: {
64
+ name: "two",
65
+ some: "shape",
66
+ containing: "PII",
67
+ },
68
+ three: "three",
69
+ });
70
+
71
+ const mockSpan = tracer.report().spans[0];
72
+ expect(mockSpan.tags()).to.deep.equal({
73
+ "rpc.jsonrpc.parameters.one": "one",
74
+ "rpc.jsonrpc.parameters.two.containing": "PII",
75
+ "rpc.jsonrpc.parameters.two.name": "two",
76
+ "rpc.jsonrpc.parameters.two.some": "shape",
77
+ "rpc.jsonrpc.parameters.three": "three",
78
+ "rpc.system": "jsonrpc",
79
+ });
80
+ }
81
+
82
+ }
83
+ module.exports = new TestTracing()
@@ -6,40 +6,162 @@
6
6
 
7
7
 
8
8
  import * as opentracing from 'opentracing';
9
- import { TracingConfig, initTracerFromEnv, Sampler, SamplingDecision } from 'jaeger-client';
10
- import { initGlobalTracer } from 'opentracing';
9
+ import { TracingConfig, initTracerFromEnv } from 'jaeger-client';
10
+ import { Sampler, SamplingDecision } from './jaeger-client-types';
11
+ import { followsFrom, initGlobalTracer } from 'opentracing';
11
12
  import { injectable } from 'inversify';
13
+ import { ResponseError } from 'vscode-jsonrpc';
14
+ import { log, LogContext } from './logging';
12
15
 
13
16
  export interface TraceContext {
14
17
  span?: opentracing.Span
15
18
  }
19
+ export type TraceContextWithSpan = TraceContext & {
20
+ span: opentracing.Span
21
+ }
22
+
16
23
 
17
24
  export namespace TraceContext {
18
- export function startSpan(operation: string, ctx: TraceContext): opentracing.Span {
19
- const options: opentracing.SpanOptions = {
20
- childOf: ctx.span
25
+ export function startSpan(operation: string, parentCtx?: TraceContext, ...referencedSpans: (opentracing.Span | undefined)[]): opentracing.Span {
26
+ const options: opentracing.SpanOptions = {};
27
+ if (parentCtx) {
28
+ options.childOf = parentCtx.span;
29
+ }
30
+ if (referencedSpans) {
31
+ // note: allthough followsForm's type says it takes 'opentracing.Span | opentracing.SpanContext', it only works with SpanContext (typing mismatch)
32
+ options.references = referencedSpans.filter(s => s !== undefined).map(s => followsFrom(s!.context()));
21
33
  }
34
+
22
35
  return opentracing.globalTracer().startSpan(operation, options);
23
36
  }
24
37
 
25
- export function startAsyncSpan(operation: string, ctx: TraceContext): opentracing.Span {
26
- const options: opentracing.SpanOptions = {};
27
- if (!!ctx.span) {
28
- options.references = [opentracing.followsFrom(ctx.span.context())];
38
+ export function childContext(operation: string, parentCtx: TraceContext): TraceContextWithSpan {
39
+ const span = startSpan(operation, parentCtx);
40
+ return { span };
41
+ }
42
+
43
+ export function setError(ctx: TraceContext, err: Error) {
44
+ if (!ctx.span) {
45
+ return;
29
46
  }
30
- return opentracing.globalTracer().startSpan(operation, options);
47
+
48
+ TraceContext.addNestedTags(ctx, {
49
+ error: {
50
+ message: err.message,
51
+ stacktrace: err.stack,
52
+ },
53
+ });
54
+ ctx.span.setTag("error", true);
55
+ }
56
+
57
+ export function setJsonRPCMetadata(ctx: TraceContext, method?: string) {
58
+ if (!ctx.span) {
59
+ return;
60
+ }
61
+
62
+ const tags: { [key: string]: any } = {
63
+ rpc: {
64
+ system: "jsonrpc",
65
+ // version,
66
+ },
67
+ };
68
+ if (method) {
69
+ tags.rpc.method = method;
70
+ }
71
+ addNestedTags(ctx, tags);
72
+ }
73
+
74
+ export function setJsonRPCError(ctx: TraceContext, method: string, err: ResponseError<any>, withStatusCode: boolean = false) {
75
+ if (!ctx.span) {
76
+ return;
77
+ }
78
+ // not use setError bc this is (most likely) a working operation
79
+
80
+ setJsonRPCMetadata(ctx, method);
81
+ // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/rpc.md#json-rpc
82
+ addNestedTags(ctx, {
83
+ rpc: {
84
+ jsonrpc: {
85
+ error_code: err.code,
86
+ error_message: err.message,
87
+ },
88
+ },
89
+ });
90
+
91
+ // the field "status_code" is used by honeycomb to derive insights like success rate, etc. Defaults to "0".
92
+ if (withStatusCode) {
93
+ ctx.span.setTag("status_code", err.code);
94
+ }
95
+ }
96
+
97
+ export function addJsonRPCParameters(ctx: TraceContext, params: { [key: string]: any }) {
98
+ if (!ctx.span) {
99
+ return;
100
+ }
101
+
102
+ setJsonRPCMetadata(ctx);
103
+ addNestedTags(ctx, {
104
+ rpc: {
105
+ jsonrpc: {
106
+ parameters: params,
107
+ },
108
+ },
109
+ });
31
110
  }
32
111
 
33
- export function logError(ctx: TraceContext, err: Error) {
112
+ /**
113
+ * Does what one would expect from `span.addTags`: Calls `span.addTag` for all keys in map, recursively for objects.
114
+ * Example:
115
+ * ```
116
+ * TraceContext.addNestedTags(ctx, {
117
+ * rpc: {
118
+ * system: "jsonrpc",
119
+ * jsonrpc: {
120
+ * version: "1.0",
121
+ * method: "test",
122
+ * parameters: ["abc", "def"],
123
+ * },
124
+ * },
125
+ * });
126
+ * ```
127
+ * gives
128
+ * rpc.system = "jsonrpc"
129
+ * rpc.jsonrpc.version = "1.0"
130
+ * rpc.jsonrpc.method = "test"
131
+ * rpc.jsonrpc.parameters.0 = "abc"
132
+ * rpc.jsonrpc.parameters.1 = "def"
133
+ * @param ctx
134
+ * @param keyValueMap
135
+ * @returns
136
+ */
137
+ export function addNestedTags(ctx: TraceContext, keyValueMap: { [key: string]: any }, _namespace?: string) {
34
138
  if (!ctx.span) {
35
139
  return;
36
140
  }
141
+ const namespace = _namespace ? `${_namespace}.` : '';
37
142
 
38
- ctx.span.log({
39
- "error": err.message,
40
- "stacktrace": err.stack
41
- })
42
- ctx.span.setTag("error", true)
143
+ try {
144
+ for (const k of Object.keys(keyValueMap)) {
145
+ const v = keyValueMap[k];
146
+ if (v instanceof Object) {
147
+ addNestedTags(ctx, v, `${namespace}${k}`);
148
+ } else {
149
+ ctx.span.setTag(`${namespace}${k}`, v);
150
+ }
151
+ }
152
+ } catch (err) {
153
+ // general resilience against odd shapes/parameters
154
+ log.error("Tracing.addNestedTags", err, { namespace });
155
+ }
156
+ }
157
+
158
+ export function setOWI(ctx: TraceContext, owi: LogContext) {
159
+ if (!ctx.span) {
160
+ return;
161
+ }
162
+ addNestedTags(ctx, {
163
+ context: owi,
164
+ });
43
165
  }
44
166
  }
45
167
 
@@ -56,11 +178,16 @@ export class TracingManager {
56
178
  reporter: {
57
179
  logSpans: false
58
180
  },
59
- serviceName
181
+ serviceName,
60
182
  }
61
183
  const t = initTracerFromEnv(config, {
62
- logger: console
184
+ logger: console,
185
+ tags: {
186
+ 'service.build.commit': process.env.GITPOD_BUILD_GIT_COMMIT,
187
+ 'service.build.version': process.env.GITPOD_BUILD_VERSION,
188
+ }
63
189
  });
190
+
64
191
  if (opts) {
65
192
  if (opts.perOpSampling) {
66
193
  (t as any)._sampler = new PerOperationSampler((t as any)._sampler, opts.perOpSampling);
@@ -132,3 +259,20 @@ export class PerOperationSampler implements Sampler {
132
259
  }
133
260
  }
134
261
  }
262
+
263
+ // Augment interfaces with an leading parameter "TraceContext" on every method
264
+ type IsValidArg<T> = T extends object ? keyof T extends never ? false : true : true;
265
+ type AddTraceContext<T> =
266
+ T extends (a: infer A, b: infer B, c: infer C, d: infer D, e: infer E, f: infer F) => infer R ? (
267
+ IsValidArg<F> extends true ? (ctx: TraceContextWithSpan, a: A, b: B, c: C, d: D, e: E, f: F) => R :
268
+ IsValidArg<E> extends true ? (ctx: TraceContextWithSpan, a: A, b: B, c: C, d: D, e: E) => R :
269
+ IsValidArg<D> extends true ? (ctx: TraceContextWithSpan, a: A, b: B, c: C, d: D) => R :
270
+ IsValidArg<C> extends true ? (ctx: TraceContextWithSpan, a: A, b: B, c: C) => R :
271
+ IsValidArg<B> extends true ? (ctx: TraceContextWithSpan, a: A, b: B) => R :
272
+ IsValidArg<A> extends true ? (ctx: TraceContextWithSpan, a: A) => R :
273
+ (ctx: TraceContextWithSpan) => Promise<R>
274
+ ) : never;
275
+
276
+ export type InterfaceWithTraceContext<T> = {
277
+ [P in keyof T]: AddTraceContext<T[P]>
278
+ };