jkennerly

Untitled

Jun 5th, 2015
19
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using ServiceStack.Text;
  5. using ServiceStack.Web;
  6. using Couchbase.Configuration.Client;
  7. using Couchbase;
  8. using Newtonsoft.Json;
  9. using Cmt.Online.Api.ServiceModel.Host;
  10. using Newtonsoft.Json.Serialization;
  11.  
  12. namespace ServiceStack.Host
  13. {
  14.     public class CouchbaseRequestLogger : InMemoryRollingRequestLogger
  15.     {
  16.         private const string SortedSetKey = "log:requests";
  17.         private const string LogBucketName = "log";
  18.  
  19.         private readonly ClientConfiguration couchbaseConfig;
  20.         private int? loggerCapacity;
  21.  
  22.         public CouchbaseRequestLogger(ClientConfiguration couchbaseConfig, int? capacity = null)
  23.         {
  24.             this.couchbaseConfig = couchbaseConfig;
  25.             this.loggerCapacity = capacity;
  26.         }
  27.  
  28.         public override void Log(IRequest request, object requestDto, object response, TimeSpan requestDuration)
  29.         {
  30.             var requestType = requestDto != null ? requestDto.GetType() : null;
  31.  
  32.             if (ExcludeRequestType(requestType))
  33.                 return;
  34.  
  35.             using (var couchbase = new Cluster(couchbaseConfig))
  36.             {
  37.                 using (var bucket = couchbase.OpenBucket(LogBucketName))
  38.                 {
  39.                     var entry = CreateEntry(request, requestDto, response, requestDuration, requestType);
  40.                     entry.Id = Convert.ToInt64(bucket.Increment(SortedSetKey).Value);
  41.  
  42.                     //string stringifiedEntry = ServiceStack.Text.JsonSerializer.SerializeToString(entry);
  43.                    
  44.                     var doc = new Document<object>
  45.                     {
  46.                         Id = entry.Id.ToString(),
  47.                         Content = entry
  48.                     };
  49.  
  50.                     var result = bucket.Insert(doc);
  51.                     if (!result.Success)
  52.                     {
  53.                         bucket.Decrement(SortedSetKey);
  54.                     }
  55.                 }
  56.  
  57.                 // TODO: Implement log capicty regarding rolling logger.
  58.                 //    if (loggerCapacity != null)
  59.                 //    {
  60.                 //        trans.QueueCommand(r => r.RemoveRangeFromSortedSet(SortedSetKey, 0, -loggerCapacity.Value - 1));
  61.                 //    }
  62.             }
  63.         }
  64.  
  65.         public override List<RequestLogEntry> GetLatestLogs(int? take)
  66.         {
  67.             using (var couchbase = new Cluster(couchbaseConfig))
  68.             {
  69.                 using (var bucket = couchbase.OpenBucket(LogBucketName))
  70.                 {
  71.                     int asInt = 0;
  72.                     var keysQuery = (take.HasValue)
  73.                         ? bucket.CreateQuery("log", "primary", true).Limit(take.Value)
  74.                         : bucket.CreateQuery("log", "primary", true);
  75.                     var keys = (from k in bucket.Query<dynamic>(keysQuery).Rows
  76.                                 where Int32.TryParse(k.Key, out asInt)
  77.                                 select asInt.ToString()).ToList();
  78.  
  79.                     var result = from r in bucket.Get<RequestLogEntry>(keys)
  80.                                  select r.Value.Value;
  81.  
  82.                     return result.ToList();
  83.  
  84.                     // Couchbase indexes in terms of Views. "log" Design Doc here on my instance has a View named "primary", which
  85.                     // is only a primary index to return keys for the bulk Get.
  86.                     //
  87.                     // map reduce of View:  function (doc, meta) {
  88.                     //                        emit(meta.id, null);
  89.                     //                      }
  90.                     //
  91.                 }
  92.             }
  93.         }
  94.     }
  95. }
RAW Paste Data