mirror of https://github.com/databricks/cli.git
use daemon
This commit is contained in:
parent
f48fbb950b
commit
520f06905b
|
@ -1,27 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
wait_file() {
|
|
||||||
local file_path="$1"
|
|
||||||
local max_attempts=100
|
|
||||||
local attempt=0
|
|
||||||
|
|
||||||
while [ $attempt -lt $max_attempts ]; do
|
|
||||||
if [ -e "$file_path" ]; then
|
|
||||||
echo "File $file_path exists"
|
|
||||||
return 0
|
|
||||||
fi
|
|
||||||
sleep 0.1
|
|
||||||
attempt=$((attempt + 1))
|
|
||||||
done
|
|
||||||
|
|
||||||
echo "Timeout: File $file_path did not appear within 10 seconds"
|
|
||||||
return 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if [ $# -eq 0 ]; then
|
|
||||||
echo "Usage: $0 <file_path>"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
wait_file "$1"
|
|
||||||
exit $?
|
|
|
@ -1,5 +0,0 @@
|
||||||
|
|
||||||
>>> [CLI] telemetry dummy
|
|
||||||
waiting for telemetry process to finish
|
|
||||||
File ./telemetry.pid exists
|
|
||||||
Process has ended
|
|
|
@ -1,5 +0,0 @@
|
||||||
|
|
||||||
>>> [CLI] telemetry dummy
|
|
||||||
waiting for telemetry process to finish
|
|
||||||
File ./telemetry.pid exists
|
|
||||||
Process has ended
|
|
|
@ -5,8 +5,8 @@
|
||||||
"uploadTime": "UNIX_TIME_MILLIS",
|
"uploadTime": "UNIX_TIME_MILLIS",
|
||||||
"items": [],
|
"items": [],
|
||||||
"protoLogs": [
|
"protoLogs": [
|
||||||
"{\"frontend_log_event_id\":\"[UUID]\",\"entry\":{\"databricks_cli_log\":{\"execution_context\":{\"cmd_exec_id\":\"[UUID]\",\"version\":\"[DEV_VERSION]\",\"command\":\"telemetry_dummy\",\"operating_system\":\"OS\",\"execution_time_ms\":\"SMALL_INT\",\"exit_code\":0},\"cli_test_event\":{\"name\":\"VALUE1\"}}}}",
|
"{\"frontend_log_event_id\":\"[UUID]\",\"entry\":{\"databricks_cli_log\":{\"execution_context\":{\"cmd_exec_id\":\"[UUID]\",\"version\":\"[DEV_VERSION]\",\"command\":\"selftest_send-telemetry\",\"operating_system\":\"OS\",\"execution_time_ms\":\"SMALL_INT\",\"exit_code\":0},\"cli_test_event\":{\"name\":\"VALUE1\"}}}}",
|
||||||
"{\"frontend_log_event_id\":\"[UUID]\",\"entry\":{\"databricks_cli_log\":{\"execution_context\":{\"cmd_exec_id\":\"[UUID]\",\"version\":\"[DEV_VERSION]\",\"command\":\"telemetry_dummy\",\"operating_system\":\"OS\",\"execution_time_ms\":\"SMALL_INT\",\"exit_code\":0},\"cli_test_event\":{\"name\":\"VALUE2\"}}}}"
|
"{\"frontend_log_event_id\":\"[UUID]\",\"entry\":{\"databricks_cli_log\":{\"execution_context\":{\"cmd_exec_id\":\"[UUID]\",\"version\":\"[DEV_VERSION]\",\"command\":\"selftest_send-telemetry\",\"operating_system\":\"OS\",\"execution_time_ms\":\"SMALL_INT\",\"exit_code\":0},\"cli_test_event\":{\"name\":\"VALUE2\"}}}}"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,3 @@
|
||||||
|
|
||||||
|
>>> [CLI] selftest send-telemetry
|
||||||
|
[wait_pid] process has ended
|
|
@ -3,12 +3,9 @@ export DATABRICKS_CLI_TELEMETRY_UPLOAD_LOGS_FILE=./out.upload.txt
|
||||||
|
|
||||||
# This test ensures that the main CLI command does not error even if
|
# This test ensures that the main CLI command does not error even if
|
||||||
# telemetry upload fails.
|
# telemetry upload fails.
|
||||||
trace $CLI telemetry dummy
|
trace $CLI selftest send-telemetry
|
||||||
|
|
||||||
echo "waiting for telemetry process to finish"
|
|
||||||
|
|
||||||
# Wait for the child telemetry process to finish
|
# Wait for the child telemetry process to finish
|
||||||
wait_file ./telemetry.pid
|
|
||||||
wait_pid $(cat ./telemetry.pid)
|
wait_pid $(cat ./telemetry.pid)
|
||||||
|
|
||||||
# cleanup the pid file
|
# cleanup the pid file
|
|
@ -5,8 +5,8 @@
|
||||||
"uploadTime": "UNIX_TIME_MILLIS",
|
"uploadTime": "UNIX_TIME_MILLIS",
|
||||||
"items": [],
|
"items": [],
|
||||||
"protoLogs": [
|
"protoLogs": [
|
||||||
"{\"frontend_log_event_id\":\"[UUID]\",\"entry\":{\"databricks_cli_log\":{\"execution_context\":{\"cmd_exec_id\":\"[UUID]\",\"version\":\"[DEV_VERSION]\",\"command\":\"telemetry_dummy\",\"operating_system\":\"OS\",\"execution_time_ms\":\"SMALL_INT\",\"exit_code\":0},\"cli_test_event\":{\"name\":\"VALUE1\"}}}}",
|
"{\"frontend_log_event_id\":\"[UUID]\",\"entry\":{\"databricks_cli_log\":{\"execution_context\":{\"cmd_exec_id\":\"[UUID]\",\"version\":\"[DEV_VERSION]\",\"command\":\"selftest_send-telemetry\",\"operating_system\":\"OS\",\"execution_time_ms\":\"SMALL_INT\",\"exit_code\":0},\"cli_test_event\":{\"name\":\"VALUE1\"}}}}",
|
||||||
"{\"frontend_log_event_id\":\"[UUID]\",\"entry\":{\"databricks_cli_log\":{\"execution_context\":{\"cmd_exec_id\":\"[UUID]\",\"version\":\"[DEV_VERSION]\",\"command\":\"telemetry_dummy\",\"operating_system\":\"OS\",\"execution_time_ms\":\"SMALL_INT\",\"exit_code\":0},\"cli_test_event\":{\"name\":\"VALUE2\"}}}}"
|
"{\"frontend_log_event_id\":\"[UUID]\",\"entry\":{\"databricks_cli_log\":{\"execution_context\":{\"cmd_exec_id\":\"[UUID]\",\"version\":\"[DEV_VERSION]\",\"command\":\"selftest_send-telemetry\",\"operating_system\":\"OS\",\"execution_time_ms\":\"SMALL_INT\",\"exit_code\":0},\"cli_test_event\":{\"name\":\"VALUE2\"}}}}"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -0,0 +1,4 @@
|
||||||
|
|
||||||
|
>>> [CLI] selftest send-telemetry
|
||||||
|
waiting for telemetry process to finish
|
||||||
|
[wait_pid] process has ended
|
|
@ -1,12 +1,11 @@
|
||||||
export DATABRICKS_CLI_TELEMETRY_PID_FILE=./telemetry.pid
|
export DATABRICKS_CLI_TELEMETRY_PID_FILE=./telemetry.pid
|
||||||
export DATABRICKS_CLI_TELEMETRY_UPLOAD_LOGS_FILE=./out.upload.txt
|
export DATABRICKS_CLI_TELEMETRY_UPLOAD_LOGS_FILE=./out.send_telemetry.txt
|
||||||
|
|
||||||
trace $CLI telemetry dummy
|
trace $CLI selftest send-telemetry
|
||||||
|
|
||||||
echo "waiting for telemetry process to finish"
|
echo "waiting for telemetry process to finish"
|
||||||
|
|
||||||
# Wait for the child telemetry process to finish
|
# Wait for the child telemetry process to finish
|
||||||
wait_file ./telemetry.pid
|
|
||||||
wait_pid $(cat ./telemetry.pid)
|
wait_pid $(cat ./telemetry.pid)
|
||||||
|
|
||||||
# cleanup the pid file
|
# cleanup the pid file
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"logs": [
|
"logs": [
|
||||||
{
|
{
|
||||||
"frontend_log_event_id": "BB79BB52-96F6-42C5-9E44-E63EEA84888D",
|
"frontend_log_event_id": "AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA",
|
||||||
"entry": {
|
"entry": {
|
||||||
"databricks_cli_log": {
|
"databricks_cli_log": {
|
||||||
"cli_test_event": {
|
"cli_test_event": {
|
||||||
|
@ -11,7 +11,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"frontend_log_event_id": "A7F597B0-66D1-462D-824C-C5C706F232E8",
|
"frontend_log_event_id": "BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB",
|
||||||
"entry": {
|
"entry": {
|
||||||
"databricks_cli_log": {
|
"databricks_cli_log": {
|
||||||
"cli_test_event": {
|
"cli_test_event": {
|
|
@ -14,7 +14,6 @@ import (
|
||||||
"github.com/databricks/cli/cmd/root"
|
"github.com/databricks/cli/cmd/root"
|
||||||
"github.com/databricks/cli/cmd/selftest"
|
"github.com/databricks/cli/cmd/selftest"
|
||||||
"github.com/databricks/cli/cmd/sync"
|
"github.com/databricks/cli/cmd/sync"
|
||||||
"github.com/databricks/cli/cmd/telemetry"
|
|
||||||
"github.com/databricks/cli/cmd/version"
|
"github.com/databricks/cli/cmd/version"
|
||||||
"github.com/databricks/cli/cmd/workspace"
|
"github.com/databricks/cli/cmd/workspace"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
@ -76,7 +75,6 @@ func New(ctx context.Context) *cobra.Command {
|
||||||
cli.AddCommand(labs.New(ctx))
|
cli.AddCommand(labs.New(ctx))
|
||||||
cli.AddCommand(sync.New())
|
cli.AddCommand(sync.New())
|
||||||
cli.AddCommand(version.New())
|
cli.AddCommand(version.New())
|
||||||
cli.AddCommand(telemetry.New())
|
|
||||||
cli.AddCommand(selftest.New())
|
cli.AddCommand(selftest.New())
|
||||||
|
|
||||||
return cli
|
return cli
|
||||||
|
|
|
@ -7,16 +7,15 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
|
||||||
"runtime"
|
"runtime"
|
||||||
"slices"
|
"slices"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/databricks/cli/internal/build"
|
"github.com/databricks/cli/internal/build"
|
||||||
"github.com/databricks/cli/libs/auth"
|
"github.com/databricks/cli/libs/auth"
|
||||||
"github.com/databricks/cli/libs/cmdio"
|
"github.com/databricks/cli/libs/cmdio"
|
||||||
|
"github.com/databricks/cli/libs/daemon"
|
||||||
"github.com/databricks/cli/libs/dbr"
|
"github.com/databricks/cli/libs/dbr"
|
||||||
"github.com/databricks/cli/libs/env"
|
"github.com/databricks/cli/libs/env"
|
||||||
"github.com/databricks/cli/libs/log"
|
"github.com/databricks/cli/libs/log"
|
||||||
|
@ -198,47 +197,38 @@ func uploadTelemetry(ctx context.Context, cmdStr string, start, end time.Time, e
|
||||||
Logs: logs,
|
Logs: logs,
|
||||||
}
|
}
|
||||||
|
|
||||||
execPath, err := os.Executable()
|
// Compute environment variables with the appropriate auth configuration.
|
||||||
if err != nil {
|
env := inheritEnvVars()
|
||||||
log.Debugf(ctx, "failed to get executable path: %s", err)
|
|
||||||
}
|
|
||||||
telemetryCmd := exec.Command(execPath, "telemetry", "upload")
|
|
||||||
telemetryCmd.Env = inheritEnvVars()
|
|
||||||
for k, v := range auth.Env(ConfigUsed(ctx)) {
|
for k, v := range auth.Env(ConfigUsed(ctx)) {
|
||||||
telemetryCmd.Env = append(telemetryCmd.Env, fmt.Sprintf("%s=%s", k, v))
|
env = append(env, fmt.Sprintf("%s=%s", k, v))
|
||||||
}
|
}
|
||||||
|
|
||||||
b, err := json.Marshal(in)
|
d := daemon.Daemon{
|
||||||
if err != nil {
|
Args: []string{"telemetry", "upload"},
|
||||||
log.Debugf(ctx, "failed to marshal telemetry logs: %s", err)
|
Env: env,
|
||||||
return
|
PidFilePath: os.Getenv(telemetry.PidFileEnvVar),
|
||||||
|
LogFile: os.Getenv(telemetry.UploadLogsFileEnvVar),
|
||||||
}
|
}
|
||||||
|
|
||||||
stdin, err := telemetryCmd.StdinPipe()
|
err := d.Start()
|
||||||
if err != nil {
|
|
||||||
log.Debugf(ctx, "failed to create stdin pipe for telemetry worker: %s", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
err = telemetryCmd.Start()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debugf(ctx, "failed to start telemetry worker: %s", err)
|
log.Debugf(ctx, "failed to start telemetry worker: %s", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if pidFilePath := env.Get(ctx, telemetry.PidFileEnvVar); pidFilePath != "" {
|
// If the telemetry worker is started successfully, we write the logs to its stdin.
|
||||||
err = os.WriteFile(pidFilePath, []byte(strconv.Itoa(telemetryCmd.Process.Pid)), 0o644)
|
b, err := json.Marshal(in)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debugf(ctx, "failed to write telemetry worker PID file: %s", err)
|
log.Debugf(ctx, "failed to marshal telemetry logs: %s", err)
|
||||||
}
|
return
|
||||||
}
|
}
|
||||||
|
err = d.WriteInput(b)
|
||||||
_, err = stdin.Write(b)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debugf(ctx, "failed to write to telemetry worker: %s", err)
|
log.Debugf(ctx, "failed to write to telemetry worker: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err = stdin.Close()
|
err = d.Release()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Debugf(ctx, "failed to close stdin for telemetry worker: %s", err)
|
log.Debugf(ctx, "failed to release telemetry worker: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,5 +13,6 @@ func New() *cobra.Command {
|
||||||
|
|
||||||
cmd.AddCommand(newChildCommand())
|
cmd.AddCommand(newChildCommand())
|
||||||
cmd.AddCommand(newParentCommand())
|
cmd.AddCommand(newParentCommand())
|
||||||
|
cmd.AddCommand(newSendTelemetry())
|
||||||
return cmd
|
return cmd
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package telemetry
|
package selftest
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/databricks/cli/cmd/root"
|
"github.com/databricks/cli/cmd/root"
|
||||||
|
@ -7,12 +7,10 @@ import (
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
func newDummyCommand() *cobra.Command {
|
func newSendTelemetry() *cobra.Command {
|
||||||
cmd := &cobra.Command{
|
cmd := &cobra.Command{
|
||||||
Use: "dummy",
|
Use: "send-telemetry",
|
||||||
Short: "log dummy telemetry events",
|
Short: "log some test telemetry events",
|
||||||
Long: "Fire a test telemetry event against the configured Databricks workspace.",
|
|
||||||
Hidden: true,
|
|
||||||
PreRunE: root.MustWorkspaceClient,
|
PreRunE: root.MustWorkspaceClient,
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
package telemetry
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
)
|
|
||||||
|
|
||||||
func New() *cobra.Command {
|
|
||||||
cmd := &cobra.Command{
|
|
||||||
Use: "telemetry",
|
|
||||||
Short: "",
|
|
||||||
Hidden: true,
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd.AddCommand(newDummyCommand())
|
|
||||||
return cmd
|
|
||||||
}
|
|
Loading…
Reference in New Issue