@cloudbase/agent-observability 0.0.20 → 0.0.21

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.
package/dist/index.js CHANGED
@@ -810,63 +810,98 @@ function createParentContext(parentSpanContext) {
810
810
  if (!parentSpanContext) return;
811
811
  return import_api4.trace.setSpanContext(import_api4.context.active(), parentSpanContext);
812
812
  }
813
- function startObservation(name, attributes, options) {
814
- const { asType = "chain", ...observationOptions } = options || {};
815
- const otelSpan = createOtelSpan({
816
- name,
817
- ...observationOptions
818
- });
813
+ function createNoopSpan() {
814
+ return import_api4.trace.wrapSpanContext(import_api4.INVALID_SPAN_CONTEXT);
815
+ }
816
+ function createNoopObservation(asType = "chain") {
817
+ const otelSpan = createNoopSpan();
819
818
  switch (asType) {
820
819
  case "llm":
821
- return new ObservationLLM({
822
- otelSpan,
823
- attributes
824
- });
820
+ return new ObservationLLM({ otelSpan });
825
821
  case "embedding":
826
- return new ObservationEmbedding({
827
- otelSpan,
828
- attributes
829
- });
822
+ return new ObservationEmbedding({ otelSpan });
830
823
  case "agent":
831
- return new ObservationAgent({
832
- otelSpan,
833
- attributes
834
- });
824
+ return new ObservationAgent({ otelSpan });
835
825
  case "tool":
836
- return new ObservationTool({
837
- otelSpan,
838
- attributes
839
- });
840
- case "chain":
841
- return new ObservationChain({
842
- otelSpan,
843
- attributes
844
- });
826
+ return new ObservationTool({ otelSpan });
845
827
  case "retriever":
846
- return new ObservationRetriever({
847
- otelSpan,
848
- attributes
849
- });
828
+ return new ObservationRetriever({ otelSpan });
850
829
  case "reranker":
851
- return new ObservationReranker({
852
- otelSpan,
853
- attributes
854
- });
830
+ return new ObservationReranker({ otelSpan });
855
831
  case "evaluator":
856
- return new ObservationEvaluator({
857
- otelSpan,
858
- attributes
859
- });
832
+ return new ObservationEvaluator({ otelSpan });
860
833
  case "guardrail":
861
- return new ObservationGuardrail({
862
- otelSpan,
863
- attributes
864
- });
834
+ return new ObservationGuardrail({ otelSpan });
835
+ case "chain":
865
836
  default:
866
- return new ObservationChain({
867
- otelSpan,
868
- attributes
869
- });
837
+ return new ObservationChain({ otelSpan });
838
+ }
839
+ }
840
+ function startObservation(name, attributes, options) {
841
+ const { asType = "chain", ...observationOptions } = options || {};
842
+ try {
843
+ const otelSpan = createOtelSpan({
844
+ name,
845
+ ...observationOptions
846
+ });
847
+ switch (asType) {
848
+ case "llm":
849
+ return new ObservationLLM({
850
+ otelSpan,
851
+ attributes
852
+ });
853
+ case "embedding":
854
+ return new ObservationEmbedding({
855
+ otelSpan,
856
+ attributes
857
+ });
858
+ case "agent":
859
+ return new ObservationAgent({
860
+ otelSpan,
861
+ attributes
862
+ });
863
+ case "tool":
864
+ return new ObservationTool({
865
+ otelSpan,
866
+ attributes
867
+ });
868
+ case "chain":
869
+ return new ObservationChain({
870
+ otelSpan,
871
+ attributes
872
+ });
873
+ case "retriever":
874
+ return new ObservationRetriever({
875
+ otelSpan,
876
+ attributes
877
+ });
878
+ case "reranker":
879
+ return new ObservationReranker({
880
+ otelSpan,
881
+ attributes
882
+ });
883
+ case "evaluator":
884
+ return new ObservationEvaluator({
885
+ otelSpan,
886
+ attributes
887
+ });
888
+ case "guardrail":
889
+ return new ObservationGuardrail({
890
+ otelSpan,
891
+ attributes
892
+ });
893
+ default:
894
+ return new ObservationChain({
895
+ otelSpan,
896
+ attributes
897
+ });
898
+ }
899
+ } catch (err) {
900
+ console.warn(
901
+ `[Observability] Failed to create observation "${name}":`,
902
+ err instanceof Error ? err.message : err
903
+ );
904
+ return createNoopObservation(asType);
870
905
  }
871
906
  }
872
907
  function updateActiveTrace(attributes) {
@@ -907,67 +942,81 @@ function wrapPromise(promise, span, endOnExit) {
907
942
  }
908
943
  function startActiveObservation(name, fn, options) {
909
944
  const { asType = "chain", endOnExit, ...observationOptions } = options || {};
910
- return getTracer().startActiveSpan(
911
- name,
912
- { startTime: observationOptions?.startTime },
913
- createParentContext(observationOptions?.parentSpanContext) ?? import_api4.context.active(),
914
- (span) => {
915
- try {
916
- let observation;
917
- switch (asType) {
918
- case "llm":
919
- observation = new ObservationLLM({ otelSpan: span });
920
- break;
921
- case "embedding":
922
- observation = new ObservationEmbedding({ otelSpan: span });
923
- break;
924
- case "agent":
925
- observation = new ObservationAgent({ otelSpan: span });
926
- break;
927
- case "tool":
928
- observation = new ObservationTool({ otelSpan: span });
929
- break;
930
- case "retriever":
931
- observation = new ObservationRetriever({ otelSpan: span });
932
- break;
933
- case "reranker":
934
- observation = new ObservationReranker({ otelSpan: span });
935
- break;
936
- case "evaluator":
937
- observation = new ObservationEvaluator({ otelSpan: span });
938
- break;
939
- case "guardrail":
940
- observation = new ObservationGuardrail({ otelSpan: span });
941
- break;
942
- case "chain":
943
- default:
944
- observation = new ObservationChain({ otelSpan: span });
945
- }
946
- const result = fn(observation);
947
- if (result instanceof Promise) {
948
- return wrapPromise(
949
- result,
950
- span,
951
- endOnExit
952
- );
953
- } else {
945
+ let fnCalled = false;
946
+ try {
947
+ return getTracer().startActiveSpan(
948
+ name,
949
+ { startTime: observationOptions?.startTime },
950
+ createParentContext(observationOptions?.parentSpanContext) ?? import_api4.context.active(),
951
+ (span) => {
952
+ try {
953
+ let observation;
954
+ switch (asType) {
955
+ case "llm":
956
+ observation = new ObservationLLM({ otelSpan: span });
957
+ break;
958
+ case "embedding":
959
+ observation = new ObservationEmbedding({ otelSpan: span });
960
+ break;
961
+ case "agent":
962
+ observation = new ObservationAgent({ otelSpan: span });
963
+ break;
964
+ case "tool":
965
+ observation = new ObservationTool({ otelSpan: span });
966
+ break;
967
+ case "retriever":
968
+ observation = new ObservationRetriever({ otelSpan: span });
969
+ break;
970
+ case "reranker":
971
+ observation = new ObservationReranker({ otelSpan: span });
972
+ break;
973
+ case "evaluator":
974
+ observation = new ObservationEvaluator({ otelSpan: span });
975
+ break;
976
+ case "guardrail":
977
+ observation = new ObservationGuardrail({ otelSpan: span });
978
+ break;
979
+ case "chain":
980
+ default:
981
+ observation = new ObservationChain({ otelSpan: span });
982
+ }
983
+ fnCalled = true;
984
+ const result = fn(observation);
985
+ if (result instanceof Promise) {
986
+ return wrapPromise(
987
+ result,
988
+ span,
989
+ endOnExit
990
+ );
991
+ } else {
992
+ if (endOnExit !== false) {
993
+ span.end();
994
+ }
995
+ return result;
996
+ }
997
+ } catch (err) {
998
+ span.setStatus({
999
+ code: import_api4.SpanStatusCode.ERROR,
1000
+ message: err instanceof Error ? err.message : "Unknown error"
1001
+ });
954
1002
  if (endOnExit !== false) {
955
1003
  span.end();
956
1004
  }
957
- return result;
958
- }
959
- } catch (err) {
960
- span.setStatus({
961
- code: import_api4.SpanStatusCode.ERROR,
962
- message: err instanceof Error ? err.message : "Unknown error"
963
- });
964
- if (endOnExit !== false) {
965
- span.end();
1005
+ throw err;
966
1006
  }
967
- throw err;
968
1007
  }
1008
+ );
1009
+ } catch (err) {
1010
+ if (fnCalled) {
1011
+ throw err;
969
1012
  }
970
- );
1013
+ console.warn(
1014
+ `[Observability] startActiveObservation "${name}" failed, falling back to no-op:`,
1015
+ err instanceof Error ? err.message : err
1016
+ );
1017
+ const noopObservation = createNoopObservation(asType);
1018
+ return fn(noopObservation);
1019
+ }
971
1020
  }
972
1021
  function updateActiveObservation(attributes) {
973
1022
  const span = import_api4.trace.getActiveSpan();
@@ -993,41 +1042,59 @@ function observe(fn, options = {}) {
993
1042
  } = options;
994
1043
  const wrappedFunction = function(...args) {
995
1044
  const name = fn.name || "anonymous-function";
996
- const inputData = captureInput ? _captureArguments(args) : void 0;
997
- const observation = startObservation(
998
- name,
999
- inputData ? { input: inputData } : {},
1000
- {
1001
- ...observationOptions,
1002
- asType
1003
- }
1004
- );
1005
- const activeContext = import_api4.trace.setSpan(import_api4.context.active(), observation.otelSpan);
1006
- const result = import_api4.context.with(activeContext, () => fn.apply(this, args));
1007
- if (result instanceof Promise) {
1008
- return result.then(
1009
- (value) => {
1010
- if (captureOutput) {
1011
- observation.update({ output: value });
1012
- }
1013
- observation.end();
1014
- return value;
1015
- },
1016
- (err) => {
1017
- observation.update({
1018
- level: "ERROR",
1019
- statusMessage: err instanceof Error ? err.message : "Unknown error"
1020
- });
1021
- observation.end();
1022
- throw err;
1045
+ let observation;
1046
+ let fnCalled = false;
1047
+ try {
1048
+ const inputData = captureInput ? _captureArguments(args) : void 0;
1049
+ observation = startObservation(
1050
+ name,
1051
+ inputData ? { input: inputData } : {},
1052
+ {
1053
+ ...observationOptions,
1054
+ asType
1023
1055
  }
1024
1056
  );
1057
+ const activeContext = import_api4.trace.setSpan(import_api4.context.active(), observation.otelSpan);
1058
+ fnCalled = true;
1059
+ const result = import_api4.context.with(activeContext, () => fn.apply(this, args));
1060
+ if (result instanceof Promise) {
1061
+ return result.then(
1062
+ (value) => {
1063
+ if (captureOutput) {
1064
+ observation.update({ output: value });
1065
+ }
1066
+ observation.end();
1067
+ return value;
1068
+ },
1069
+ (err) => {
1070
+ observation.update({
1071
+ level: "ERROR",
1072
+ statusMessage: err instanceof Error ? err.message : "Unknown error"
1073
+ });
1074
+ observation.end();
1075
+ throw err;
1076
+ }
1077
+ );
1078
+ }
1079
+ if (captureOutput) {
1080
+ observation.update({ output: result });
1081
+ }
1082
+ observation.end();
1083
+ return result;
1084
+ } catch (err) {
1085
+ if (fnCalled) {
1086
+ throw err;
1087
+ }
1088
+ console.warn(
1089
+ `[Observability] observe "${name}" failed, falling back to direct call:`,
1090
+ err instanceof Error ? err.message : err
1091
+ );
1092
+ try {
1093
+ observation?.end();
1094
+ } catch {
1095
+ }
1096
+ return fn.apply(this, args);
1025
1097
  }
1026
- if (captureOutput) {
1027
- observation.update({ output: result });
1028
- }
1029
- observation.end();
1030
- return result;
1031
1098
  };
1032
1099
  Object.defineProperty(wrappedFunction, "name", { value: fn.name });
1033
1100
  Object.defineProperty(wrappedFunction, "length", { value: fn.length });