We want know how many times each user calls IBM Watson Assistant service from client application and its billing details per user. I am trying to enable user metrics for watson assistant service based on this URL(https://console.bluemix.net/docs/services/assistant/logs_oview.html#user_id) and added the headers and metadata in my node.js code. But when I check the Improve tab in conversation its not showing the user details, its showing count 0.
I am using LITE plan and below is the code.
// conversation config
var conversation = new ConversationV1({
url: 'https://gateway.watsonplatform.net/conversation/api',
username: process.env.CONVERSATION_USERNAME,
password: process.env.CONVERSATION_PASSWORD,
version_date: '2018-02-16',
version: 'v1',
context : {
metadata : {
"user_id": "{1234}"
}
},
headers: {'X-Watson-Metadata':'customer_id=user777;customer_id=xyz'}
});
app.js code:
'use strict';
require('dotenv').config({ silent: true });
var express = require('express'); // app server
var bodyParser = require('body-parser'); // parser for post requests
//setup watson services
var ConversationV1 = require('watson-developer-cloud/conversation/v1'); //
watson sdk
var DiscoveryV1 = require('watson-developer-cloud/discovery/v1');
var app = express();
// Bootstrap application settings
app.use(express.static('./public')); // load UI from public folder
app.use(bodyParser.json());
// conversation config
var conversation = new ConversationV1({
url: 'https://gateway.watsonplatform.net/conversation/api',
username: process.env.CONVERSATION_USERNAME || 'replace with the
username',
password: process.env.CONVERSATION_PASSWORD || 'replace with the
password',
version_date: '2018-02-16', //set currenct date, check here
https://www.ibm.com/watson/developercloud/conversation/api/v1/#versioning
version: 'v1',
context : {
metadata : {
"user_id": "{1234}"
}
},
headers: {'X-Watson-Metadata':'customer_id=user777;customer_id=xyz'}
});
// Endpoint to be call from the client side for message
app.post('/api/message', (req, res) => {
var workspace = process.env.WORKSPACE_ID || '<workspace-id>';
if (!workspace || workspace === '<workspace-id>') {
return res.json({
'output': {
'text': 'Please update the WORKSPACE_ID in your .env file with
your credential! If you did update, try to verify if the file are just
with the name: .env'
}
});
}
var payload = {
workspace_id: workspace,
context: {},
input: {}
};
if (req.body) {
if (req.body.input) {
payload.input = req.body.input;
}
if (req.body.context) {
// The client must maintain context/state
payload.context = req.body.context;
}
}
// Send the input to the conversation service
conversation.message(payload, function(err, data) {
if (err) {
return res.status(err.code || 500).json(err);
}
updateMessage(res, payload, data);
});
});
function updateMessage(res, input, response) {
if (!response.output) {
response.output = {};
} else if (response.output && response.output.text) {
return res.json(response);
}
}
module.exports = app;
You need to add the user id information to the context that you send when calling the message API. Each request to Watson Assistant can have a different userid, e.g., when you have a multi-tenant application and your app / server handles multiple users and their requests in parallel.
Check out the context section for the message call, it has information about where to place that data in the JSON structure. You could merge your context updates into the message payload:
{
workspace_id: '{workspace_id}',
input: {'text': 'Hello'},
context: {
metadata : {
"user_id": "{1234}"
}
}
}
Once your app has sent different user_id values, you should see the following in the Improve dashboard (I tested on my Lite plan with 2 user IDs). Different active users:
Average conversations per user:
In addition, you can check the logs. In that conversation entries is the user_id field in the context metadata - the same your app sent as part of the message request.