Saturday, 25 July 2015

Exploring Event Hubs in Azure

Hi All,

Recently in project I got a chance to explore Azure Event Hub and I really liked it, its brilliant service from Azure for some targeted scenarios. There is lots of good stuff available but since it took time for me to explore, I thought to share here in a simple way. Lets start the show :)

What is Event Hub : 

1. Event hub is a azure service that can be used to take large amount of data/events (can take/log millions of data/events per second in near real time). 
2. This large amount of data can be collected from WebSites, client apps (Mobile, web), IOT sensors, feeds from social network 
3. Process/analyze this large amount of event data using any real-time analytics system like Apache Storm, Azure analytic system etc.
4. Either store/transform this data into any data storage system including blob storage, hDInsight and Hadoop based solutions

Scenarios: What are the scenarios where we can think to use Event Hub?

1. Where we need to integrate/coordinate/receive millions of things (IoT Internet of Things), for example receive messages from millions of sensors, coordinate messages between thousands of trains or taxis and why not, send millions of logging messages to the Cloud (On Premise Tracking/Monitoring/Advertising Centralization) and more.
2. Where we need to collect audit data from devices on the field.
3. To collect the GPS locations of devices. 
And many more...

Few points to be consider while using Event Hubs

1. Event data size: Maximum event data of a batch that contains multiple event data is 256kb.

This is all about theory part, now we will see how to send the messages to Event Hub and receive those for further analyzing/processing. 

Steps:
1. We need to create Event Hub in Azure Portal. For this we will require Azure account to login to Azure management portal. If you don't have an azure account we can also create free trial azure account.

2. Log on to Azure management portal. Click on “+NEW” 


 Go to APP SERVICES >> SERVICE BUS >> EVENT HUB as


 Click on QUICK CREATE and enter the respective details “EVENT HUB NAME”, “REGION” and ‘’NAMSPACE NAME” as
  

Once event hub successfully created, you will see as


 So here event hub is created now we will send and receive the message to event hub.  

Now lets explore the code require for sending message. Before starting code we will require sdk for “Microsoft Service Azure Bus”, you can install it with the help of NuGet manager as 
 

Once the above NuGet package installed it will add references to ServiceBus library. To send the message we will also require the event hub connection string, which we will get from azure management portal, click on the namespace 




Click on Management tasks >> Manage Connection Strings, we will get the connection string for sending and receiving the messages as


 Copy the above connection strings. 

And finally, following is the code for sending the message:

var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName);
   try{
      var serializedString = JsonConvert.SerializeObject(“Message to send”);
      EventData data = new EventData(Encoding.UTF8.GetBytes(serializedString));
      data.PartitionKey = "15";
                
      await eventHubClient.SendAsync(data);

     }catch (Exception exception){
//ToDo: Exception handling
     }

Receiving the message:

For receiving message we use EventProcessorHost class. To use this class we will require azure storage account. Use the Azure Management Portal to create the storage account, click on “+NEW” as 



Once data storage successfully created, click on it. From the bottom of the page click on “MANAGE ACCESS KEYS” as 

 Manage Access Keys pop up will appear as 


 Copy the primary access key which we will require in our receiver code. 

Finally simple receiver code:

 string eventHubConnectionString = "my event hub connection key for receiver";

 string eventHubName = "eventhubname";
 string storageAccountName = "storage account name";
 string storageAccountKey = "storage account key;
 string storageConnectionString =  string.Format("DefaultEndpointsProtocol=https;AccountName={0};AccountKey={1}",storageAccountName, storageAccountKey);

string eventProcessorHostName = Guid.NewGuid().ToString();
EventProcessorHost eventProcessorHost = new EventProcessorHost(eventProcessorHostName, eventHubName, EventHubConsumerGroup.DefaultGroupName, eventHubConnectionString, storageConnectionString);
     eventProcessorHost.RegisterEventProcessorAsync<EventProcessor>().Wait();

In above code in RegisterEventProcessorAsyncwe are registering the EventProcessor class which is derived from IEventProcessorThis class allows us to processes the events/messages. 

public class EventProcessor : IEventProcessor
    {

async Task IEventProcessor.ProcessEventsAsync(PartitionContext partitionContext, IEnumerable<EventData> messages)
  {
            foreach (EventData event in messages)
            {
//ToDo: event processing logic
                 
            }
        }

 References:


Thanks!

Enjoy reading :)

Please share your suggestion / comments / feedback if any.

Sunday, 19 July 2015

How to get my followed sites in SharePoint Online

Hi All,

In SharePoint 2013 new social features are incorporated, one of those is following. We can follow Users / Peoples, Documents, Sites and Tags. This is very good reference https://msdn.microsoft.com/en-us/library/office/jj163280.aspx 

Scenario:

We have our portal site collection and my site collection in Office 365 sites. We have requirement like show only sites which are followed by the current user (User who is currently logged in to the site) on portal site collection. 

On my site collection this webpart is already available as 



Figure 1: OOB XSLTViewer web part on MySite: Sites I'm following

On my site collection this is XSLTViewer web part used for Social list. For more details like how it is configured please have a look at http://prashamsabadra.blogspot.in/2012/08/small-finding-related-to-social.html

But Social list we don't have available on portal site collection so we cant use the web part which is on My site collection. 

Approach: We decided to use the rest service for getting the current user followed sites as  /_api/social.following/my/followed%28types=4%29 more details on Social feed REST API reference for SharePoint 2013. Here type is 4 which is for sites. %28 for ‘(‘ and 29 for ‘)’. If you want to directly run into browser try like this

<Site Collection>/_api/social.following/my/followed(types=4)
We have written one JavaScript file, called above rest service and just appended in Div tag. We have uploaded JS file in “Master Page Gallery”. 

We have added content editor web part on the page and refer the JS link as 


Figure 2: Referring JS in Content Editor web part

Few code snippet as (please bear with UI and HTML formatting)

//function : calls rest service
function getMyFollowedSites() 
{
var restUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/social.following/my/followed%28types=4%29"; //Type 4 for sites

    var executor = new SP.RequestExecutor(_spPageContextInfo.webAbsoluteUrl);
    executor.executeAsync(
    {
        url: restUrl,
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
        success: successHandler,
        error: failureHandler
    });
}

//success callback
function successHandler(data) 
{
  var jsonObject = JSON.parse(data.body);
  var results = jsonObject.d.Followed.results;
  var htmlString = '';

    // preparing the HTML for the result
    for (resultCount=0;resultCount<results.length;resultCount++)
    {
//Preparing the HTML
htmlString += "<a id=\"aid"+resultCount+"\"title=\""+results[resultCount].Name+"\" href=\""+results[resultCount].Uri+"\">"+results[resultCount].Name+"</a>      ";

htmlString += results[resultCount].Uri;
htmlString += "<br/>";
    }
    htmlString +="</div>";

htmlResultDiv = document.getElementById('htmlResult');
htmlResultDiv.innerHTML=htmlString;
}

 // Failure callback
function failureHandler(data, errorCode, errorMessage) 
{
   alert('Error Code: ' + errorCode);
   alert('Error Message: ' + errorMessage);
}

Html
<div>
<div id="htmlResult"  style="float:left;"></div>
</div>

Thanks!

Enjoy reading :)

Feel free to comment/suggestions/feedback :)