[llvm] 2ec6174 - Revert "[llvm]Add a simple Telemetry framework" (#120769)

via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 20 08:27:08 PST 2024


Author: Vy Nguyen
Date: 2024-12-20T11:27:04-05:00
New Revision: 2ec6174bef4bc9ef3d5cedbffd7169017c9669c3

URL: https://github.com/llvm/llvm-project/commit/2ec6174bef4bc9ef3d5cedbffd7169017c9669c3
DIFF: https://github.com/llvm/llvm-project/commit/2ec6174bef4bc9ef3d5cedbffd7169017c9669c3.diff

LOG: Revert "[llvm]Add a simple Telemetry framework" (#120769)

Reverts llvm/llvm-project#102323
Reason: broke CI

Added: 
    

Modified: 
    llvm/docs/UserGuides.rst
    llvm/lib/CMakeLists.txt
    llvm/unittests/CMakeLists.txt

Removed: 
    llvm/docs/Telemetry.rst
    llvm/docs/llvm_telemetry_design.png
    llvm/include/llvm/Telemetry/Telemetry.h
    llvm/lib/Telemetry/CMakeLists.txt
    llvm/lib/Telemetry/Telemetry.cpp
    llvm/unittests/Telemetry/CMakeLists.txt
    llvm/unittests/Telemetry/TelemetryTest.cpp


################################################################################
diff  --git a/llvm/docs/Telemetry.rst b/llvm/docs/Telemetry.rst
deleted file mode 100644
index e9d0d2cf95220e..00000000000000
--- a/llvm/docs/Telemetry.rst
+++ /dev/null
@@ -1,257 +0,0 @@
-===========================
-Telemetry framework in LLVM
-===========================
-
-.. contents::
-   :local:
-
-.. toctree::
-   :hidden:
-
-Objective
-=========
-
-Provides a common framework in LLVM for collecting various usage and performance
-metrics.
-It is located at ``llvm/Telemetry/Telemetry.h``.
-
-Characteristics
----------------
-* Configurable and extensible by:
-
-  * Tools: any tool that wants to use Telemetry can extend and customize it.
-  * Vendors: Toolchain vendors can also provide custom implementation of the
-    library, which could either override or extend the given tool's upstream
-    implementation, to best fit their organization's usage and privacy models.
-  * End users of such tool can also configure Telemetry (as allowed by their
-    vendor).
-
-Important notes
----------------
-
-* There is no concrete implementation of a Telemetry library in upstream LLVM.
-  We only provide the abstract API here. Any tool that wants telemetry will
-  implement one.
-  
-  The rationale for this is that all the tools in LLVM are very 
diff erent in
-  what they care about (what/where/when to instrument data). Hence, it might not
-  be practical to have a single implementation.
-  However, in the future, if we see enough common pattern, we can extract them
-  into a shared place. This is TBD - contributions are welcome.
-
-* No implementation of Telemetry in upstream LLVM shall store any of the
-  collected data due to privacy and security reasons:
-  
-  * Different organizations have 
diff erent privacy models:
-  
-    * Which data is sensitive, which is not?
-    * Whether it is acceptable for instrumented data to be stored anywhere?
-      (to a local file, what not?)
-      
-  * Data ownership and data collection consents are hard to accommodate from
-    LLVM developers' point of view:
-  
-    * E.g., data collected by Telemetry is not necessarily owned by the user
-      of an LLVM tool with Telemetry enabled, hence the user's consent to data
-      collection is not meaningful. On the other hand, LLVM developers have no
-      reasonable ways to request consent from the "real" owners.
-
-
-High-level design
-=================
-
-Key components
---------------
-
-The framework consists of four important classes:
-
-* ``llvm::telemetry::Manager``: The class responsible for collecting and
-  transmitting telemetry data. This is the main point of interaction between the
-  framework and any tool that wants to enable telemetry.
-* ``llvm::telemetry::TelemetryInfo``: Data courier
-* ``llvm::telemetry::Destination``: Data sink to which the Telemetry framework
-  sends data.
-  Its implementation is transparent to the framework.
-  It is up to the vendor to decide which pieces of data to forward and where
-  to forward them to for their final storage.
-* ``llvm::telemetry::Config``: Configurations for the ``Manager``.
-  
-.. image:: llvm_telemetry_design.png
-
-How to implement and interact with the API
-------------------------------------------
-
-To use Telemetry in your tool, you need to provide a concrete implementation of the ``Manager`` class and ``Destination``.
-
-1) Define a custom ``Serializer``, ``Manager``, ``Destination`` and optionally a subclass of ``TelemetryInfo``
-
-.. code-block:: c++
-
-  class JsonSerializer : public Serializer {
-  public:
-    json::Object *getOutputObject() { return Out.get(); }
-
-    Error init() override {
-      if (Started)
-        return createStringError("Serializer already in use");
-      started = true;
-      Out = std::make_unique<json::Object>();
-      return Error::success();
-    }
-
-    // Serialize the given value.
-    void write(StringRef KeyName, bool Value) override {
-      writeHelper(KeyName, Value);
-    }
-
-    void write(StringRef KeyName, int Value) override {
-      writeHelper(KeyName, Value);
-    }
-
-    void write(StringRef KeyName, unsigned int Value) override {
-      writeHelper(KeyName, Value);
-    }
-
-    void write(StringRef KeyName, unsigned long Value) override {
-      writeHelper(KeyName, Value);
-    }
-
-    void write(StringRef KeyName, long Value) override {
-      writeHelper(KeyName, Value);
-    }
-
-    void write(StringRef KeyName, long long Value ) override {
-      writeHelper(KeyName, Value);
-    }
-
-    void write(StringRef KeyName, unsigned long long Value) override {
-      writeHelper(KeyName, Value);
-    }
-
-    void write(StringRef KeyName, StringRef Value) override {
-      writeHelper(KeyName, Value);
-    }
- 
-    void beginObject(StringRef KeyName) override {
-      Children.push_back(json::Object());
-      ChildrenNames.push_back(KeyName.str());
-    }
-    
-    void endObject() override {
-      assert(!Children.empty() && !ChildrenNames.empty());
-      json::Value Val = json::Value(std::move(Children.back()));
-      std::string Name = ChildrenNames.back();
-
-      Children.pop_back();
-      ChildrenNames.pop_back();
-      writeHelper(Name, std::move(Val));
-    }
-    
-    Error finalize() override {
-      if (!Started)
-        return createStringError("Serializer not currently in use");
-      Started = false;
-      return Error::success();
-    }
-
-  private:
-    template <typename T> void writeHelper(StringRef Name, T Value) {
-      assert(Started && "serializer not started");
-      if (Children.empty())
-        Out->try_emplace(Name, Value);
-      else
-        Children.back().try_emplace(Name, Value);
-    }
-    bool Started = false;
-    std::unique_ptr<json::Object> Out;
-    std::vector<json::Object> Children;
-    std::vector<std::string> ChildrenNames;
-  };
-       
-  class MyManager : public telemery::Manager {
-  public:
-  static std::unique_ptr<MyManager> createInstatnce(telemetry::Config *Config) {
-    // If Telemetry is not enabled, then just return null;
-    if (!Config->EnableTelemetry)
-      return nullptr;
-    return std::make_unique<MyManager>();
-  }
-  MyManager() = default;
-
-  Error preDispatch(TelemetryInfo *Entry) override {
-    Entry->SessionId = SessionId;
-    return Error::success();
-  }
-  
-  // You can also define additional instrumentation points.
-  void logStartup(TelemetryInfo *Entry) {
-    // Add some additional data to entry.
-    Entry->Msg = "Some message";
-    dispatch(Entry);
-  }
-  
-  void logAdditionalPoint(TelemetryInfo *Entry) {
-    // .... code here
-  }
-  
-  private:    
-    const std::string SessionId;
-  };
-
-  class MyDestination : public telemetry::Destination {
-  public:
-    Error receiveEntry(const TelemetryInfo *Entry) override {
-      if (Error Err = Serializer.init())
-        return Err;
-      
-      Entry->serialize(Serializer);
-      if (Error Err = Serializer.finalize())
-        return Err;
-      
-      json::Object Copied = *Serializer.getOutputObject();
-      // Send the `Copied` object to wherever.
-      return Error::success();
-    }
-
-  private:
-    JsonSerializer Serializer;
-  };
-
-  // This defines a custom TelemetryInfo that has an additional Msg field.
-  struct MyTelemetryInfo : public telemetry::TelemetryInfo {
-    std::string Msg;
-    
-    Error serialize(Serializer &Serializer) const override {
-      TelemetryInfo::serialize(serializer);
-      Serializer.writeString("MyMsg", Msg);
-    }
-      
-    // Note: implement getKind() and classof() to support dyn_cast operations.
-  };
-
-    
-2) Use the library in your tool.
-
-Logging the tool init-process:
-
-.. code-block:: c++
-
-  // In tool's initialization code.
-  auto StartTime = std::chrono::time_point<std::chrono::steady_clock>::now();
-  telemetry::Config MyConfig = makeConfig(); // Build up the appropriate Config struct here.
-  auto Manager = MyManager::createInstance(&MyConfig);
-
-  
-  // Any other tool's init code can go here.
-  // ...
-  
-  // Finally, take a snapshot of the time now so we know how long it took the
-  // init process to finish.
-  auto EndTime = std::chrono::time_point<std::chrono::steady_clock>::now();
-  MyTelemetryInfo Entry;
-
-  Entry.Start = StartTime;
-  Entry.End = EndTime;
-  Manager->logStartup(&Entry);
-
-Similar code can be used for logging the tool's exit.

diff  --git a/llvm/docs/UserGuides.rst b/llvm/docs/UserGuides.rst
index 6eee564713d6de..0b204d512876a3 100644
--- a/llvm/docs/UserGuides.rst
+++ b/llvm/docs/UserGuides.rst
@@ -72,7 +72,6 @@ intermediate LLVM representation.
    SupportLibrary
    TableGen/index
    TableGenFundamentals
-   Telemetry
    Vectorizers
    WritingAnLLVMPass
    WritingAnLLVMNewPMPass
@@ -294,6 +293,3 @@ Additional Topics
 
 :doc:`Sandbox IR <SandboxIR>`
    This document describes the design and usage of Sandbox IR, a transactional layer over LLVM IR.
-
-:doc:`Telemetry`
-   This document describes the Telemetry framework in LLVM.

diff  --git a/llvm/docs/llvm_telemetry_design.png b/llvm/docs/llvm_telemetry_design.png
deleted file mode 100644
index 48fbc003da18e6..00000000000000
Binary files a/llvm/docs/llvm_telemetry_design.png and /dev/null 
diff er

diff  --git a/llvm/include/llvm/Telemetry/Telemetry.h b/llvm/include/llvm/Telemetry/Telemetry.h
deleted file mode 100644
index ed519448315c2f..00000000000000
--- a/llvm/include/llvm/Telemetry/Telemetry.h
+++ /dev/null
@@ -1,162 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// This file provides the basic framework for Telemetry.
-/// Refer to its documentation at llvm/docs/Telemetry.rst for more details.
-//===---------------------------------------------------------------------===//
-
-#ifndef LLVM_TELEMETRY_TELEMETRY_H
-#define LLVM_TELEMETRY_TELEMETRY_H
-
-#include "llvm/ADT/DenseMap.h"
-#include "llvm/ADT/StringExtras.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Error.h"
-#include <map>
-#include <memory>
-#include <optional>
-#include <string>
-#include <type_traits>
-#include <vector>
-
-namespace llvm {
-namespace telemetry {
-
-class Serializer {
-public:
-  virtual Error init() = 0;
-  virtual void write(StringRef KeyName, bool Value) = 0;
-  virtual void write(StringRef KeyName, StringRef Value) = 0;
-
-  template <typename T>
-  std::enable_if_t<std::is_integral_v<T>> write(StringRef KeyName, T Value) {
-    if constexpr (std::is_signed_v<T>)
-      writeSigned(KeyName, Value);
-    else
-      writeUnsigned(KeyName, Value);
-  }
-
-  template <typename T, typename = typename T::mapped_type>
-  void write(StringRef KeyName, const T &Map) {
-    static_assert(std::is_convertible_v<typename T::key_type, StringRef>,
-                  "KeyType must be convertible to string");
-    beginObject(KeyName);
-    for (const auto &KeyVal : Map)
-      write(KeyVal.first, KeyVal.second);
-    endObject();
-  }
-
-  virtual void beginObject(StringRef KeyName) = 0;
-  virtual void endObject() = 0;
-
-  virtual Error finalize() = 0;
-
-private:
-  virtual void writeUnsigned(StringRef KeyName, unsigned long long) = 0;
-  virtual void writeSigned(StringRef KeyName, long long) = 0;
-};
-
-/// Configuration for the Manager class.
-/// This stores configurations from both users and vendors and is passed
-/// to the Manager upon construction. (Any changes to the config after
-/// the Manager's construction will not have any effect on it).
-///
-/// This struct can be extended as needed to add additional configuration
-/// points specific to a vendor's implementation.
-struct Config {
-  // If true, telemetry will be enabled.
-  const bool EnableTelemetry;
-  Config(bool E) : EnableTelemetry(E) {}
-
-  virtual std::optional<std::string> makeSessionId() { return std::nullopt; }
-};
-
-/// For isa, dyn_cast, etc operations on TelemetryInfo.
-typedef unsigned KindType;
-/// This struct is used by TelemetryInfo to support isa<>, dyn_cast<>
-/// operations.
-/// It is defined as a struct (rather than an enum) because it is
-/// expected to be extended by subclasses which may have
-/// additional TelemetryInfo types defined to describe 
diff erent events.
-struct EntryKind {
-  static const KindType Base = 0;
-};
-
-/// TelemetryInfo is the data courier, used to move instrumented data
-/// from the tool being monitored to the Telemetry framework.
-///
-/// This base class contains only the basic set of telemetry data.
-/// Downstream implementations can define more subclasses with
-/// additional fields to describe 
diff erent events and concepts.
-///
-/// For example, The LLDB debugger can define a DebugCommandInfo subclass
-/// which has additional fields about the debug-command being instrumented,
-/// such as `CommandArguments` or `CommandName`.
-struct TelemetryInfo {
-  // This represents a unique-id, conventionally corresponding to
-  // a tool's session - i.e., every time the tool starts until it exits.
-  //
-  // Note: a tool could have multiple sessions running at once, in which
-  // case, these shall be multiple sets of TelemetryInfo with multiple unique
-  // IDs.
-  //
-  // Different usages can assign 
diff erent types of IDs to this field.
-  std::string SessionId;
-
-  TelemetryInfo() = default;
-  virtual ~TelemetryInfo() = default;
-
-  virtual void serialize(Serializer &serializer) const;
-
-  // For isa, dyn_cast, etc, operations.
-  virtual KindType getKind() const { return EntryKind::Base; }
-  static bool classof(const TelemetryInfo *T) {
-    return T->getKind() == EntryKind::Base;
-  }
-};
-
-/// This class presents a data sink to which the Telemetry framework
-/// sends data.
-///
-/// Its implementation is transparent to the framework.
-/// It is up to the vendor to decide which pieces of data to forward
-/// and where to forward them.
-class Destination {
-public:
-  virtual ~Destination() = default;
-  virtual Error receiveEntry(const TelemetryInfo *Entry) = 0;
-  virtual StringLiteral name() const = 0;
-};
-
-/// This class is the main interaction point between any LLVM tool
-/// and this framework.
-/// It is responsible for collecting telemetry data from the tool being
-/// monitored and transmitting the data elsewhere.
-class Manager {
-public:
-  // Optional callback for subclasses to perform additional tasks before
-  // dispatching to Destinations.
-  virtual Error preDispatch(TelemetryInfo *Entry) = 0;
-
-  // Dispatch Telemetry data to the Destination(s).
-  // The argument is non-const because the Manager may add or remove
-  // data from the entry.
-  virtual Error dispatch(TelemetryInfo *Entry);
-
-  // Register a Destination.
-  void addDestination(std::unique_ptr<Destination> Destination);
-
-private:
-  std::vector<std::unique_ptr<Destination>> Destinations;
-};
-
-} // namespace telemetry
-} // namespace llvm
-
-#endif // LLVM_TELEMETRY_TELEMETRY_H

diff  --git a/llvm/lib/CMakeLists.txt b/llvm/lib/CMakeLists.txt
index f6465612d30c0b..503c77cb13bd07 100644
--- a/llvm/lib/CMakeLists.txt
+++ b/llvm/lib/CMakeLists.txt
@@ -41,7 +41,6 @@ add_subdirectory(ProfileData)
 add_subdirectory(Passes)
 add_subdirectory(TargetParser)
 add_subdirectory(TextAPI)
-add_subdirectory(Telemetry)
 add_subdirectory(ToolDrivers)
 add_subdirectory(XRay)
 if (LLVM_INCLUDE_TESTS)

diff  --git a/llvm/lib/Telemetry/CMakeLists.txt b/llvm/lib/Telemetry/CMakeLists.txt
deleted file mode 100644
index 8208bdadb05e94..00000000000000
--- a/llvm/lib/Telemetry/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-add_llvm_component_library(LLVMTelemetry
-  Telemetry.cpp
-
-  ADDITIONAL_HEADER_DIRS
-  "${LLVM_MAIN_INCLUDE_DIR}/llvm/Telemetry"
-)

diff  --git a/llvm/lib/Telemetry/Telemetry.cpp b/llvm/lib/Telemetry/Telemetry.cpp
deleted file mode 100644
index de8e77d52623c4..00000000000000
--- a/llvm/lib/Telemetry/Telemetry.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-#include "llvm/Telemetry/Telemetry.h"
-
-namespace llvm {
-namespace telemetry {
-
-void TelemetryInfo::serialize(Serializer &serializer) const {
-  serializer.write("SessionId", SessionId);
-}
-
-Error Manager::dispatch(TelemetryInfo *Entry) {
-  if (Error Err = preDispatch(Entry))
-    return std::move(Err);
-
-  Error AllErrs = Error::success();
-  for (auto &Dest : Destinations) {
-    AllErrs = joinErrors(std::move(AllErrs), Dest->receiveEntry(Entry));
-  }
-  return AllErrs;
-}
-
-void Manager::addDestination(std::unique_ptr<Destination> Dest) {
-  Destinations.push_back(std::move(Dest));
-}
-
-} // namespace telemetry
-} // namespace llvm

diff  --git a/llvm/unittests/CMakeLists.txt b/llvm/unittests/CMakeLists.txt
index 81abce51b8939f..8892f3e75729ab 100644
--- a/llvm/unittests/CMakeLists.txt
+++ b/llvm/unittests/CMakeLists.txt
@@ -63,7 +63,6 @@ add_subdirectory(Support)
 add_subdirectory(TableGen)
 add_subdirectory(Target)
 add_subdirectory(TargetParser)
-add_subdirectory(Telemetry)
 add_subdirectory(Testing)
 add_subdirectory(TextAPI)
 add_subdirectory(Transforms)

diff  --git a/llvm/unittests/Telemetry/CMakeLists.txt b/llvm/unittests/Telemetry/CMakeLists.txt
deleted file mode 100644
index a40ae4b2f55607..00000000000000
--- a/llvm/unittests/Telemetry/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-set(LLVM_LINK_COMPONENTS
-  Telemetry
-  Core
-  Support
-  )
-
-add_llvm_unittest(TelemetryTests
-  TelemetryTest.cpp
-  )

diff  --git a/llvm/unittests/Telemetry/TelemetryTest.cpp b/llvm/unittests/Telemetry/TelemetryTest.cpp
deleted file mode 100644
index 05523f1bcfaa20..00000000000000
--- a/llvm/unittests/Telemetry/TelemetryTest.cpp
+++ /dev/null
@@ -1,242 +0,0 @@
-//===- llvm/unittest/Telemetry/TelemetryTest.cpp - Telemetry unittests ---===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#include "llvm/Telemetry/Telemetry.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Casting.h"
-#include "llvm/Support/Error.h"
-#include "gtest/gtest.h"
-#include <optional>
-#include <vector>
-
-namespace llvm {
-namespace telemetry {
-// Testing parameters.
-//
-// These are set by each test to force certain outcomes.
-struct TestContext {
-  // Controlling whether there is vendor plugin.  In "real" implementation, the
-  // plugin-registration framework will handle the overrides but for tests, we
-  // just use a bool flag to decide which function to call.
-  bool HasVendorPlugin = false;
-
-  // This field contains data emitted by the framework for later
-  // verification by the tests.
-  std::string Buffer = "";
-
-  // The expected Uuid generated by the fake tool.
-  std::string ExpectedUuid = "";
-};
-
-class StringSerializer : public Serializer {
-public:
-  const std::string &getString() { return Buffer; }
-
-  Error init() override {
-    if (Started)
-      return createStringError("Serializer already in use");
-    Started = true;
-    Buffer.clear();
-    return Error::success();
-  }
-
-  void write(StringRef KeyName, bool Value) override {
-    writeHelper(KeyName, Value);
-  }
-
-  void write(StringRef KeyName, StringRef Value) override {
-    writeHelper(KeyName, Value);
-  }
-
-  void beginObject(StringRef KeyName) override {
-    Children.push_back(std::string("\n"));
-    ChildrenNames.push_back(KeyName.str());
-  }
-
-  void endObject() override {
-    assert(!Children.empty() && !ChildrenNames.empty());
-    std::string ChildBuff = Children.back();
-    std::string Name = ChildrenNames.back();
-    Children.pop_back();
-    ChildrenNames.pop_back();
-    writeHelper(Name, ChildBuff);
-  }
-
-  Error finalize() override {
-    assert(Children.empty() && ChildrenNames.empty());
-    if (!Started)
-      return createStringError("Serializer not currently in use");
-    Started = false;
-    return Error::success();
-  }
-
-private:
-  template <typename T> void writeHelper(StringRef Name, T Value) {
-    assert(Started && "serializer not started");
-    if (Children.empty())
-      Buffer.append((Name + ":" + Twine(Value) + "\n").str());
-    else
-      Children.back().append((Name + ":" + Twine(Value) + "\n").str());
-  }
-
-  void writeUnsigned(StringRef KeyName, unsigned long long Value) override {
-    writeHelper(KeyName, Value);
-  }
-
-  void writeSigned(StringRef KeyName, long long Value) override {
-    writeHelper(KeyName, Value);
-  }
-
-  bool Started = false;
-  std::string Buffer;
-  std::vector<std::string> Children;
-  std::vector<std::string> ChildrenNames;
-};
-
-namespace vendor {
-struct VendorConfig : public Config {
-  VendorConfig(bool Enable) : Config(Enable) {}
-  std::optional<std::string> makeSessionId() override {
-    static int seed = 0;
-    return std::to_string(seed++);
-  }
-};
-
-std::shared_ptr<Config> getTelemetryConfig(const TestContext &Ctxt) {
-  return std::make_shared<VendorConfig>(/*EnableTelemetry=*/true);
-}
-
-class TestStorageDestination : public Destination {
-public:
-  TestStorageDestination(TestContext *Ctxt) : CurrentContext(Ctxt) {}
-
-  Error receiveEntry(const TelemetryInfo *Entry) override {
-    if (Error Err = serializer.init())
-      return Err;
-
-    Entry->serialize(serializer);
-    if (Error Err = serializer.finalize())
-      return Err;
-
-    CurrentContext->Buffer.append(serializer.getString());
-    return Error::success();
-  }
-
-  StringLiteral name() const override { return "TestDestination"; }
-
-private:
-  TestContext *CurrentContext;
-  StringSerializer serializer;
-};
-
-struct StartupInfo : public TelemetryInfo {
-  std::string ToolName;
-  std::map<std::string, std::string> MetaData;
-
-  void serialize(Serializer &serializer) const override {
-    TelemetryInfo::serialize(serializer);
-    serializer.write("ToolName", ToolName);
-    serializer.write("MetaData", MetaData);
-  }
-};
-
-struct ExitInfo : public TelemetryInfo {
-  int ExitCode;
-  std::string ExitDesc;
-  void serialize(Serializer &serializer) const override {
-    TelemetryInfo::serialize(serializer);
-    serializer.write("ExitCode", ExitCode);
-    serializer.write("ExitDesc", ExitDesc);
-  }
-};
-
-class TestManager : public Manager {
-public:
-  static std::unique_ptr<TestManager>
-  createInstance(Config *Config, TestContext *CurrentContext) {
-    if (!Config->EnableTelemetry)
-      return nullptr;
-    CurrentContext->ExpectedUuid = *(Config->makeSessionId());
-    std::unique_ptr<TestManager> Ret = std::make_unique<TestManager>(
-        CurrentContext, CurrentContext->ExpectedUuid);
-
-    // Add a destination.
-    Ret->addDestination(
-        std::make_unique<TestStorageDestination>(CurrentContext));
-
-    return Ret;
-  }
-
-  TestManager(TestContext *Ctxt, std::string Id)
-      : CurrentContext(Ctxt), SessionId(Id) {}
-
-  Error preDispatch(TelemetryInfo *Entry) override {
-    Entry->SessionId = SessionId;
-    return Error::success();
-  }
-
-  std::string getSessionId() { return SessionId; }
-
-private:
-  TestContext *CurrentContext;
-  const std::string SessionId;
-};
-} // namespace vendor
-
-std::shared_ptr<Config> getTelemetryConfig(const TestContext &Ctxt) {
-  if (Ctxt.HasVendorPlugin)
-    return vendor::getTelemetryConfig(Ctxt);
-
-  return std::make_shared<Config>(false);
-}
-
-TEST(TelemetryTest, TelemetryDisabled) {
-  TestContext Context;
-  Context.HasVendorPlugin = false;
-
-  std::shared_ptr<Config> Config = getTelemetryConfig(Context);
-  auto Manager = vendor::TestManager::createInstance(Config.get(), &Context);
-  EXPECT_EQ(nullptr, Manager);
-}
-
-TEST(TelemetryTest, TelemetryEnabled) {
-  const std::string ToolName = "TelemetryTestTool";
-
-  // Preset some params.
-  TestContext Context;
-  Context.HasVendorPlugin = true;
-  Context.Buffer.clear();
-
-  std::shared_ptr<Config> Config = getTelemetryConfig(Context);
-  auto Manager = vendor::TestManager::createInstance(Config.get(), &Context);
-
-  EXPECT_STREQ(Manager->getSessionId().c_str(), Context.ExpectedUuid.c_str());
-
-  vendor::StartupInfo S;
-  S.ToolName = ToolName;
-  S.MetaData["a"] = "A";
-  S.MetaData["b"] = "B";
-
-  Error startupEmitStatus = Manager->dispatch(&S);
-  EXPECT_FALSE(startupEmitStatus);
-  std::string ExpectedBuffer =
-      "SessionId:0\nToolName:TelemetryTestTool\nMetaData:\na:A\nb:B\n\n";
-  EXPECT_EQ(ExpectedBuffer, Context.Buffer);
-  Context.Buffer.clear();
-
-  vendor::ExitInfo E;
-  E.ExitCode = 0;
-  E.ExitDesc = "success";
-  Error exitEmitStatus = Manager->dispatch(&E);
-  EXPECT_FALSE(exitEmitStatus);
-  ExpectedBuffer = "SessionId:0\nExitCode:0\nExitDesc:success\n";
-  EXPECT_EQ(ExpectedBuffer, Context.Buffer);
-}
-
-} // namespace telemetry
-} // namespace llvm


        


More information about the llvm-commits mailing list