json-able process-info first cut
diff --git a/src/folsom_vm_metrics.erl b/src/folsom_vm_metrics.erl
index baaa3f5..8bec5a9 100644
--- a/src/folsom_vm_metrics.erl
+++ b/src/folsom_vm_metrics.erl
@@ -47,10 +47,10 @@
     [{Key, convert_system_info({Key, erlang:system_info(Key)})} || Key <- ?SYSTEM_INFO].
 
 get_process_info() ->
-    [{pid_to_list(Pid), get_process_info(Pid)} || Pid <- processes()].
+    [{convert_pid_port_fun(Pid), get_process_info(Pid)} || Pid <- processes()].
 
 get_port_info() ->
-    [{erlang:port_to_list(Port), get_port_info(Port)} || Port <- erlang:ports()].
+    [{convert_pid_port_fun(Port), get_port_info(Port)} || Port <- erlang:ports()].
 
 
 
@@ -131,7 +131,8 @@
   Acc.
 
 get_process_info(Pid) ->
-    [process_info(Pid, Key) || Key <- ?PROCESS_INFO].
+    Info = [process_info(Pid, Key) || Key <- ?PROCESS_INFO],
+    lists:flatten([convert_pid_info(Item) || Item <- Info]).
 
 get_port_info(Port) ->
     Stat = get_socket_getstat(Port),
@@ -215,8 +216,61 @@
     [A, B, C, D].
 
 convert_port_info({links, List}) ->
-    {links, [pid_to_list(Item) || Item <- List]};
+    {links, [convert_pid_port_fun(Item) || Item <- List]};
 convert_port_info({connected, Pid}) ->
-    {connected, pid_to_list(Pid)};
+    {connected, convert_pid_port_fun(Pid)};
 convert_port_info(Item) ->
     Item.
+
+convert_pid_info({current_function, MFA}) ->
+    {current_function, tuple_to_list(MFA)};
+convert_pid_info({dictionary, List}) ->
+    {dictionary, convert_dictionary(List, [])};
+convert_pid_info({Key, Pid}) when is_pid(Pid) ->
+    {Key, convert_pid_port_fun(Pid)};
+convert_pid_info({links, List}) ->
+    {links, [convert_pid_port_fun(Item) || Item <- List]};
+convert_pid_info({suspending, List}) ->
+    {suspending, [convert_pid_port_fun(Item) || Item <- List]};
+convert_pid_info({monitors, List}) ->
+    {monitors, [convert_pid_port_fun(Item) || Item <- List]};
+convert_pid_info({monitored_by, List}) ->
+    {monitored_by, [convert_pid_port_fun(Item) || Item <- List]};
+convert_pid_info({binary, List}) ->
+    {binary, [tuple_to_list(Item) || Item <- List]};
+convert_pid_info({initial_call, MFA}) ->
+    {inital_call, tuple_to_list(MFA)};
+convert_pid_info(Item) ->
+    Item.
+
+convert_pid_port_fun(Term) when is_pid(Term) ->
+    pid_to_list(Term);
+convert_pid_port_fun(Term) when is_port(Term) ->
+    erlang:port_to_list(Term);
+convert_pid_port_fun(Term) when is_function(Term) ->
+    erlang:fun_to_list(Term);
+convert_pid_port_fun(Term) ->
+    Term.
+
+convert_dictionary([], Acc) ->
+    Acc;
+convert_dictionary([{Key, Value} | Tail], Acc) when is_pid(Value) or is_port(Value) or is_function(Value) ->
+     convert_dictionary(Tail, [{Key, convert_pid_port_fun(Value)} | Acc]);
+convert_dictionary([{'$ancestors', List} | Tail], Acc) ->
+    AncList = {'$ancestors', [convert_pid_port_fun(Item) || Item <- List]},
+    convert_dictionary(Tail, [AncList | Acc]);
+convert_dictionary([{longnames, Value} | Tail], Acc) ->
+     convert_dictionary(Tail, [{longnames, Value} | Acc]);
+convert_dictionary([{shortnames, Value} | Tail], Acc) ->
+     convert_dictionary(Tail, [{shortnames, Value} | Acc]);
+convert_dictionary([{echo, Value} | Tail], Acc) ->
+     convert_dictionary(Tail, [{echo, Value} | Acc]);
+convert_dictionary([{read_mode, Value} | Tail], Acc) ->
+     convert_dictionary(Tail, [{read_mode, Value} | Acc]);
+convert_dictionary([{Key, Value} | Tail], Acc) when is_list(Value) ->
+    convert_dictionary(Tail, [{Key, Value} | Acc]);
+convert_dictionary([{Key, Value} | Tail], Acc) when is_tuple(Value) ->
+    convert_dictionary(Tail, [{Key, tuple_to_list(Value)} | Acc]);
+convert_dictionary([Head | Tail], Acc) when is_tuple(Head) ->
+    convert_dictionary(Tail, [tuple_to_list(Head), Acc]).
+