/// <summary> /// Start a tracker with a default emitter /// </summary> /// <param name="endpoint">Hostname of your collector</param> /// <param name="dbPath">A filename/path to store queued events in</param> /// <param name="method">The method used to send events to a collector. GET or POST</param> /// <param name="subject">Information on the user</param> /// <param name="clientSession"></param> /// <param name="trackerNamespace">Namespace of tracker</param> /// <param name="appId">Application ID of tracker</param> /// <param name="encodeBase64">Base64 encode collector parameters</param> /// <param name="synchronous">Whether to do I/O synchronously</param> /// <param name="desktopContextDelegate">Delegate for fetching the desktop context</param> /// <param name="mobileContextDelegate">Delegate for fetching the mobile context</param> /// <param name="geoLocationContextDelegate">Delegate for fetching the geo-location context</param> /// <param name="l">A logger to emit an activity stream to</param> public void Start(string endpoint, string dbPath, HttpMethod method = HttpMethod.POST, Subject subject = null, ClientSession clientSession = null, string trackerNamespace = null, string appId = null, bool encodeBase64 = true, bool synchronous = true, DesktopContextDelegate desktopContextDelegate = null, MobileContextDelegate mobileContextDelegate = null, GeoLocationContextDelegate geoLocationContextDelegate = null, ILogger l = null) { AsyncEmitter emitter; lock (_lock) { var dest = new SnowplowHttpCollectorEndpoint(endpoint, method: method, l: l); var storage = new LiteDBStorage(dbPath); _storage = storage; var queue = new PersistentBlockingQueue(storage, new PayloadToJsonString()); emitter = new AsyncEmitter(dest, queue, l: l); } Start(emitter, subject, clientSession, trackerNamespace, appId, synchronous, encodeBase64, desktopContextDelegate, mobileContextDelegate, geoLocationContextDelegate, l); }
/// <summary> /// Start a tracker with a custom emitter /// </summary> /// <param name="emitter">The emitter to send events to</param> /// <param name="subject">Information on the user</param> /// <param name="clientSession">Client sessionization object</param> /// <param name="trackerNamespace">Namespace of tracker</param> /// <param name="appId">Application ID of tracker</param> /// <param name="encodeBase64">Base64 encode collector parameters</param> /// <param name="synchronous">Whether to do I/O synchronously</param> /// <param name="desktopContextDelegate">Delegate for fetching the desktop context</param> /// <param name="mobileContextDelegate">Delegate for fetching the mobile context</param> /// <param name="geoLocationContextDelegate">Delegate for fetching the geo-location context</param> /// <param name="l">A logger to emit an activity stream to</param> public void Start(IEmitter emitter, Subject subject = null, ClientSession clientSession = null, string trackerNamespace = null, string appId = null, bool encodeBase64 = true, bool synchronous = true, DesktopContextDelegate desktopContextDelegate = null, MobileContextDelegate mobileContextDelegate = null, GeoLocationContextDelegate geoLocationContextDelegate = null, ILogger l = null) { lock (_lock) { if (_running) { throw new InvalidOperationException("Cannot start - already started"); } _emitter = emitter; _emitter.Start(); if (clientSession != null) { _clientSession = clientSession; _clientSession.StartChecker(); } _subject = subject ?? new Subject(); _encodeBase64 = encodeBase64; _logger = l ?? new NoLogging(); _standardNvPairs = new Dictionary <string, string> { { Constants.TRACKER_VERSION, Version.VERSION }, { Constants.NAMESPACE, trackerNamespace }, { Constants.APP_ID, appId } }; _synchronous = synchronous; _desktopContextDelegate = desktopContextDelegate; _mobileContextDelegate = mobileContextDelegate; _geoLocationDelegate = geoLocationContextDelegate; _running = true; _logger.Info("Tracker started"); } }
/// <summary> /// Inits the Snowplow Tracker; after this point it can be accessed globally. /// </summary> /// <param name="emitterUri">The emitter URI</param> /// <param name="protocol">The protocol to use</param> /// <param name="port">The port the collector is on</param> /// <param name="method">The method to use</param> /// <param name="useClientSession">Whether to enable client session</param> /// <param name="useMobileContext">Whether to enable mobile contexts</param> /// <param name="useGeoLocationContext">Whether to enable geo-location contexts</param> public static void Init( string emitterUri, HttpProtocol protocol = HttpProtocol.HTTP, int?port = null, HttpMethod method = HttpMethod.GET, bool useClientSession = false, bool useMobileContext = false, bool useGeoLocationContext = false) { var logger = new ConsoleLogger(); var dest = new SnowplowHttpCollectorEndpoint(emitterUri, method: method, port: port, protocol: protocol, l: logger); // Note: Maintain reference to Storage as this will need to be disposed of manually _storage = new LiteDBStorage(SnowplowTrackerPlatformExtension.Current.GetLocalFilePath("events.db")); var queue = new PersistentBlockingQueue(_storage, new PayloadToJsonString()); // Note: When using GET requests the sendLimit equals the number of concurrent requests - to many of these will break your application! var sendLimit = method == HttpMethod.GET ? 10 : 100; // Note: To make the tracker more battery friendly and less likely to drain batteries there are two settings to take note of here: // 1. The stopPollIntervalMs: Controls how often we look to the database for more events // 2. The deviceOnlineMethod: Is run before going to the database or attempting to send events, this will prevent any I/O from // occurring unless you have an active network connection var emitter = new AsyncEmitter(dest, queue, sendLimit: sendLimit, stopPollIntervalMs: 1000, sendSuccessMethod: EventSuccessCallback, deviceOnlineMethod: SnowplowTrackerPlatformExtension.Current.IsDeviceOnline, l: logger); var userId = PropertyManager.GetStringValue(KEY_USER_ID, SnowplowCore.Utils.GetGUID()); PropertyManager.SaveKeyValue(KEY_USER_ID, userId); var subject = new Subject() .SetPlatform(Platform.Mob) .SetUserId(userId) .SetLang("en"); if (useClientSession) { _clientSession = new ClientSession(SnowplowTrackerPlatformExtension.Current.GetLocalFilePath("client_session.dict"), l: logger); } // Note: You can either attach contexts to each event individually or for the more common contexts such as Desktop, Mobile and GeoLocation // you can pass a delegate method which will then be called for each event automatically. MobileContextDelegate mobileContextDelegate = null; if (useMobileContext) { mobileContextDelegate = SnowplowTrackerPlatformExtension.Current.GetMobileContext; } GeoLocationContextDelegate geoLocationContextDelegate = null; if (useMobileContext) { geoLocationContextDelegate = SnowplowTrackerPlatformExtension.Current.GetGeoLocationContext; } // Attach the created objects and begin all required background threads! Instance.Start(emitter: emitter, subject: subject, clientSession: _clientSession, trackerNamespace: _trackerNamespace, appId: _appId, encodeBase64: false, synchronous: false, mobileContextDelegate: mobileContextDelegate, geoLocationContextDelegate: geoLocationContextDelegate, l: logger); // Reset session counters SessionMadeCount = 0; SessionSuccessCount = 0; SessionFailureCount = 0; }